Zum Hauptinhalt springen

Tag 6: WMI und CIM

1 Windows Management Instrumentation (WMI)​

WMI ist seit Windows 2000 ein Teil von Windows. Es kann genutzt werden, um fast alle Eigenschaften von einem Gerät (auch über Remote) herauszulesen. Powershell hat standardmässig einen vollen WMI-Support. Um alle WMI-Commands auszulesen, kann das Get-Command Cmdlet genutzt werden.

get-command -noun WMI*
Output
CommandType     Name                                               Version    Source
----------- ---- ------- ------
Cmdlet Get-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Invoke-WmiMethod 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Register-WmiEvent 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-WmiInstance 3.1.0.0 Microsoft.PowerShell.Management

Eine Alternative zu WMI ist Common Information Model (CIM). Es wurde in PowerShell v3.0 eingeführt. CIM kann auf Windows, sowie auf nicht-Windows Rechnern genutzt werden. Auch hier kann das Cmdlet Get-Command genutzt werden um alle CIM-Commands anzuzeigen.

get-command -module cimcmdlets
Output
CommandType     Name                                               Version    Source
----------- ---- ------- ------
Cmdlet Export-BinaryMiLog 1.0.0.0 cimcmdlets
Cmdlet Get-CimAssociatedInstance 1.0.0.0 cimcmdlets
Cmdlet Get-CimClass 1.0.0.0 cimcmdlets
Cmdlet Get-CimInstance 1.0.0.0 cimcmdlets
Cmdlet Get-CimSession 1.0.0.0 cimcmdlets
Cmdlet Import-BinaryMiLog 1.0.0.0 cimcmdlets
Cmdlet Invoke-CimMethod 1.0.0.0 cimcmdlets
Cmdlet New-CimInstance 1.0.0.0 cimcmdlets
Cmdlet New-CimSession 1.0.0.0 cimcmdlets
Cmdlet New-CimSessionOption 1.0.0.0 cimcmdlets
Cmdlet Register-CimIndicationEvent 1.0.0.0 cimcmdlets
Cmdlet Remove-CimInstance 1.0.0.0 cimcmdlets
Cmdlet Remove-CimSession 1.0.0.0 cimcmdlets
Cmdlet Set-CimInstance 1.0.0.0 cimcmdlets

WMI und CIM können auch mit SQL-Abfragen genutzt werden.

get-wmiobject -query 'select * from win32_bios'

Allerdings kann auch das normale Powershell-Schema genutzt werden.

get-wmiobject win32_bios
Alias get-wmiobject

Zum Cmdlet get-wmiobject gibt es den Alias gwmi

2 Übungen zu WMI​

Schreiben Sie eine Funktion, welche die freie Diskkapazität pro Disk in GB in einer Hashtable zurückgibt (Win32_LogicalDisk).

gwmi win32_logicaldisk | foreach {$_.name, ($_.freespace /1GB)}

Schreiben Sie eine Funktion, welche die totale RAM-Kapazität in GB zurückgibt (Win32_PhysicalMemory).

gwmi win32_physicalmemory | foreach {$_.capacity /1GB}
gwmi win32_physicalmemory | foreach {$_.capacity /1GB} | measure -sum | foreach {$_.sum}

Schreiben Sie eine Funktion, welche die freie RAM-Kapazität zurückgibt (Win32_OperatingSystem).

gwmi win32_operatingsystem | foreach {$_.freephysicalmemory /1E+6}

Schreiben Sie eine Funktion, welche alle lokalen Benutzer (Benutzernamen) in einem Array zurückgibt (Win32_UserAccount).

gwmi win32_useraccount | foreach {$_.name}

Schreiben Sie eine Funktion, welche Name und Pfad aller Freigaben zurückgibt.

gwmi win32_share | select {$_.name, $_.path}
gwmi win32_share | foreach {$_.name, $_.path}