Zum Hauptinhalt springen

Die CIM-Cmdlets

Die neuen CIM-Cmdlets machen grundsätzlich das gleiche wie Get-WmiObject, bringen aber einige Erweiterungen mit, wenn es um den Remotezugriff geht. Bei der Benennung hat Microsoft außerdem versucht, die Cmdlets dem Namensschema für Cmdlets besser anzupassen. Deshalb gibt es unterschied-liche Cmdlets für das Auflisten von Klassen und das Abfragen von Instanzen:

Get-CimClass -ClassName *
Get-CimClass -ClassName Win32*

Das Cmdlet Get-CimClass entspricht in der Funktionalität Get-WmiObject -List. Eine kleine Stolperfalle: Get-CIMClass benötigt immer einen Platzhalter für den Klassennamen, während -List bei Get-Wmi-Object wie ein Switch-Parameter verwendet werden kann.

Um die Instanz einer Klasse abzufragen, verwendet man Get-CimClass:

Get-CimClass -ClassName Win32_Computersystem

Um Klassen remote abzufragen, unterstützt Get-CimClass auch einen Parameter Computername, aber keinen (!) Parameter -Credential, so dass ein Wechsel des Benutzerkontextes nicht möglich ist. Das wirkt auf den ersten Blick verwirrend, aber es gibt eine bessere Alternative. Mit Hilfe des Cmdlets New-CimSession kann man nämlich eine Remotesitzung aufbauen, und dann alle Abfragen durch dieselbe Verbindung schicken:

$cred = Get-Credential
$CimSession = New-CimSession -Credential $cred -ComputerName DC1 
Get-CimClass -ClassName Win32_Computersystem -CimSession $CimSession
Get-CimClass -ClassName Win32_Operatingsystem -CimSession $CimSession 
Get-CimClass -ClassName Win32_Bios -CimSession $CimSession
$CimSession.Close()

New-CimSession führt jetzt nur eine Authentifizierung gegen den Zielcomputer aus, und Get-CimClass verwendet für jede Abfrage dieselbe Netzwerksitzung. Denken Sie aber daran, die Sitzung wieder zu beenden, nachdem Sie alle Daten eingesammelt haben. Das geht mit der Close()-Methode des Sitzungs-objekts, oder einfach mit Remove-CimSession:

Get-CimSession | Remove-CimSession

Get-WmiObject und die neuen Cim-Cmdlets unterscheiden sich auch darin, wie sie Daten remote abfragen. Während Get-WmiObject immer DCOM (Distributed COM) für die Remoteverbindung benutzt, verwendet New-CimSession standardmäßig Powershell Remoting. Powershell Remoting ist nicht nur sicherer als DCOM, weil es eine Authentifizierung standardmäßig nur mit Kerberos erlaubt, es verwendet auch nur einen Port für den Datenaustausch. DCOM benötigt dagegen TCP-Port 135 und handelt dann eine Reihe von hohen Ports für die RPC-Verbindung aus.

Die CIM-Session kann mit CIM-Sitzungsoptionen weiter konfiguriert. Um ein Sitzungsoptions-Objekt zu erzeugen, steht New-CimSessionOption zur Verfügung. Damit kann man New-CimSession auch dazu zwingen, die Verbindung mit DCOM auszuführen:

$cred = Get-Credential
$CimOpt = New-CimSessionOption -Protocol Dcom
$CimSes = New-CimSession -Credential $cred -ComputerName DC1 -SessionOption $CimOpt
Get-CimClass -ClassName Win32_Computersystem -CimSession $CimSes
$CimSession.Close()

Mehr zu DCOM-Ports finden Sie unter Service overview and network port requirements for Windows.

 
$cred = Get-Credential
$CimSession = New-CimSession -Credential $cred -ComputerName DC1 Get-CimClass -ClassName Win32_Computersystem -CimSession $CimSession
Get-CimClass -ClassName Win32_Operatingsystem -CimSession $CimSession 
Get-CimClass -ClassName Win32_Bios -CimSession $CimSession
$CimSession.Close()
 

Get-WmiObject

Um die WMI-Datenbank per Powershell abzufragen, kann man Get-WmiObject verwenden. Seit Powershell 4 stehen außerdem die Cmdlets Get-CimClass und Get-CimInstance zur Verfügung, die im Prinzip das gleiche machen wie Get-WmiObject, aber speziell im Bereich Remoteabfragen ein paar zusätzliche Funktionen bieten. Die neuen CIM-Cmdlets lösen das alte Cmdlet Get-WmiObject ab, der ab Powershell 6 nicht mehr vorhanden ist. 

Um sich mit Get-WmiObject die verfügbaren Klassen des CIMV2-Namespace anzeigen zu lassen, ver-wenden man den Parameter -list:

Get-WMIObject -List

> NameSpace: ROOT\cimv2
> Name             Methods    Properties
> ----             -------    ----------
> __SystemClass    {}         {}
> __thisNAMESPACE  {}         {SECURITY_DESCRIPTOR}
> __Provider       {}         {Name}
> __Win32Provider  {}         {ClientLoadableCLSID,

Get-WMIObject -List Win32*

> NameSpace: ROOT\cimv2
> Name                                  Methods      Properties
> ----                                  -------      ----------
> Win32_DeviceChangeEvent               {}           {EventType,…
> Win32_SystemConfigurationChangeE...   {}           {EventType,…
> Win32_VolumeChangeEvent               {}           {DriveName,…
> Win32_SystemTrace                     {}           {SECURITY_DESCRIPTOR,…
> Win32_ProcessTrace                    {}           {ParentProcessID,…
> [...]

Um einen anderen Namespace abzufragen, kann der Parameter Namespace genutzt werden:

Get-WmiObject -List -Namespace ROOT\Virtualization

Der Virtualization-Namespace stellt beispielsweise zusätzliche Klassen zum Steuern von Hyper-V bereit. 

Die Eigenschaften der Klasse erhält man mit dem Parameter -Class:

Get-WmiObject -Class Win32_Computersystem
> Domain              : WORKGROUP 
> Manufacturer        : Microsoft Corporation 
> Model               : Virtual Machine
> Name                : DESKTOP-01UULH5
> PrimaryOwnerName    : student 
> TotalPhysicalMemory : 2146299904

Get-WmiObject liefert ein Objekt zurück. Das Objekt zeigt dank des ETS wieder nur einen Teil der Eigenschaften der Instanz an. Man kann wie üblich Select-Object benutzen, um alle Eigenschaften in der Konsole sichtbar zu machen:

Get-WmiObject -Class Win32_Computersystem | Select-Object -Property *

> PSComputerName         : DESKTOP-01UULH5
> AdminPasswordStatus    : 3
> BootupState            : Normal boot
> ChassisBootupState     : 3
> KeyboardPasswordStatus : 3
> PowerOnPasswordStatus  : 3
…

Mit dem Parameter -Computername können Abfragen auch Remote ausgeführt werden:

$cred = Get-Credential
Get-WmiObject -Class Win32_Computersystem -ComputerName DC1 -Credential $Cred

> Domain              : bitweise.de 
> Manufacturer        : Microsoft Corporation 
> Model               : Virtual Machine
> Name                : DC1
> PrimaryOwnerName    : 
> TotalPhysicalMemory : 2146349056

Der Parameter -Credential erlaubt es, andere Anmeldeinformationen zu verwenden. Grundsätzlich ist das aber nur notwendig, wenn das verwendete Benutzerkonto keine Administrator-Rechte auf dem Zielsystem hat, da die Anmeldeinformationen ansonsten per Single Sign On durchgeschleift werden.

Um mehrere Klassen mit Get-WmiObject Remote abzufragen, können mehrere Abfragen nacheinander initiieren werden. Dabei wird jedes Mal eine neue Anmeldung durchgeführt:

$cred = Get-Credential
Get-WmiObject -Class Win32_Computersystem -ComputerName DC1 -Credential $Cred
Get-WmiObject -Class Win32_Operatingsystem -ComputerName DC1 -Credential $Cred
Get-WmiObject -Class Win32_Bios -ComputerName DC1 -Credential $cred
 
Get-WmiObject -Class Win32_Computersystem
> Domain              : WORKGROUP 
> Manufacturer        : Microsoft Corporation 
> Model               : Virtual Machine
> Name                : DESKTOP-01UULH5
> PrimaryOwnerName    :  student 
> TotalPhysicalMemory : 2146299904

WMI und CIM

WMI oder Windows Management Instrumentation erlaubt es, Daten über Windows-Computer abzufragen aus einer Datenbankähnlichen Struktur abzufragen, die aus Klassen besteht. Die WMI-Klassen sind in Namensräume ähnlich der .NET-Klassen aufgeteilt, über die sich diverse Informationen über den Rechner abfragen lassen. Eine sehr einfache Möglichkeit, sich erst einmal einen Überblick über alle verfügbaren WMI-Klassen zu verschaffen, bietet der WMI-Explorer, den man kostenlos von Github herunterladen kann.

Image 112

WMI-Daten können auch remote abgefragt werden. Geben Sie hierfür in (1) als erstes den Namen des Computers ein, den Sie abfragen wollen. Standardmäßig steht in diesem Feld ein Punkt, was auf den lokalen Computer verweist. Sobald Sie Connect wählen, wird der Punkt durch den Namen des lokalen Computers ersetzt, und im Feld Namespaces (2) werden alle verfügbaren "Unterordner" aufgelistet, die abgefragt werden können. Der für Windows-Systeme interessanteste Namensraum ist Root\CIMV2. CIM steht für Common Information Model und ist der ursprüngliche und inzwischen wieder aktuelle Name von WMI. Wenn Sie den Namensraum doppelt anklicken, listet Windows alle Klassen auf, die im Namensraum vorhanden sind. Wenn der WMI-Explorer scheinbar nichts tut, können Sie in (3) sehen, ob er noch arbeitet oder Sie nicht schnell genug geklickt haben.

Sobald alle Klassen aufgelistet sind, zeigt (4) alle im Namensraum verfügbaren Klassen an. Mit dem Quick-Filter (5) können festlegen, welche Klassen angezeigt werden sollen. Alle interessanten Klassen des Namensraums fangen mit Win32 an, so dass das als Ausgangsfilter eine gute Basis ist.

Die Klassen beinhalten keine Informationen, sondern bilden wieder nur die Vorlagen, die definieren, welche Daten Sie aus der Klasse erhalten können. Das Konzept der Namensbildung ist für die Klassen dabei ähnlich wie bei Powershell-Cmdlets: Sie tragen entsprechende Namen, so dass man auf den ersten Blick erkennen kann, welche Daten man aus einer Klasse beziehen kann.

Um die Klasse abzufragen, wählen Sie sie und anschließend in (6) die Instanz aus. Viele Klassen bieten Ihnen nur eine Instanz (also ein Objekt) an, aber wenn Sie z.B. mehrere Speichermodule haben und Sie Win32_MemoryDevice auswählen, wird Ihnen für jedes Speichermodul eine Instanz angezeigt. Wenn Sie die Instanz auswählen, sehen Sie in (7) die Eigenschaften der Instanz. Da es sich bei den Instanzen um Objekte handelt, stellt Ihnen WMI übrigens nicht nur Eigenschaften, sondern auch Methoden zur Verfügung, um den Computer zu steuern.