Get-CimClass: WMI-Klassen finden in PowerShell


    Tags: ,

    WMIWindows bietet zahl­reiche WMI- bzw. CIM-Klas­sen, die wiederum viele Eigen­schaften und Methoden enthalten. Power­Shell kann die Suche nach den benö­tigten Infor­ma­tionen durch Fil­tern der Ergeb­nis­liste verein­fachen.

    Bei der Windows Management Instrumentation (WMI) handelt es sich um die Microsoft-Implementierung des offenen Standards Common Information Model (CIM). Verwirrend aus PowerShell-Sicht ist jedoch, dass die Version 3.0 zusätzlich zu den Cmdlets für WMI noch Pendants für CIM brachte. So erhielt etwa Get-WmiObject einen Gegenspieler namens Get-CimInstance.

    Ein wesentlicher Unterschied zwischen den WMI- und CIM-Cmdlets besteht darin, dass Erstere über DCOM kommunizieren und Zweitere über WinRM, und somit über HTTP(S).

    Aber nicht genug damit, Microsoft implementierte parallel zu den WMI- auch die reinen CIM-Klassen. So existiert beispielsweise neben Win32_Process auch CIM_Process, wobei sich beide in den von ihnen bereit­gestellten Eigenschaften und Methoden unterscheiden.

    Die Unterschiede zwischen den Klassen Win32_Process und CIM_Process

    Insgesamt kommt auf diese Weise eine große Zahl an Klassen zusammen, auf einem aktuellen Windows 10 sind es 1117. Ihre vornehmliche Verwendung besteht im (Remote-)Abrufen von System­infor­mationen, aber die enthaltenen Methoden können auch Einstellungen ändern.

    WMI-Klassen filtern

    Wenn man sich in diesem Wust orientieren möchte, dürfte das Wälzen der Dokumentation nicht unbedingt der schnellste Weg zum Ziel sein. Als Alternative bietet sich das Cmdlet Get-CimClass an. Mit dem Parameter ClassName kann man das Suchergebnis einfach eingrenzen, auch weil dieser Wildcards akzeptiert.

    Um nur die (am meisten genutzten) Win32-Klassen anzuzeigen, gibt man

    Get-CimClass -ClassName Win32_*

    Nachdem dieser Befehl immer noch eine Liste von 666 Klassen auswirft, wird man den Filter weiter verengen müssen, etwa indem man die zahlreichen Klassen für Performance und Plug-and-Play ausschließt:

    Get-CimClass -ClassName Win32_* | ? {$_.CimClassName -notlike "*Perf*" -and $_.CimClassName -notlike "*PnP*"}

    Eigenschaften in Klassen finden

    Falls man schon weiß, welche Eigenschaft man benötigt, aber nicht, in welcher Klasse sie vorhanden ist, dann hilft das Cmdlet ebenfalls weiter:

    Get-CimClass -ClassName Win32_* -PropertyName OSarchitecture

    Dieses Beispiel findet die Klasse Win32_OperatingSystem, deren Eigenschaft OSarchitecture Auskunft darüber gibt, ob das Betriebssystem in einer 32- oder 64-Vit-Version vorliegt.

    Klassen nach Methoden filtern

    Nach einem ähnlichen Muster kann man nach bestimmten Methoden suchen. Will man etwa einen Remote-PC über die Kommando­zeile umbenennen, dann sucht man folgendermaßen in allen Win32-Klassen nach der Methode rename:

    Get-CimClass -ClassName Win32_* -MethodName rename

    Das Ergebnis umfasst zwar 8 Klassen, aber man kann sich schnell zusammen­reimen, dass Win32_ComputerSystem die richtige sein muss.

    Parameter abfragen

    Verwendet man Methoden von WMI-Klassen, dann stellt sich natürlich häufig die Frage, welche Parameter sie in welcher Reihenfolge erwarten. Dies lässt sich auf folgende Weise ermitteln:

    (Get-CimClass -ClassName Win32_Computersystem).CimClassMethods["rename"].Parameters

    Liste der Eigenschaften und Methoden auflösen

    Schließlich stellt sich häufig das Problem, dass man eine Klasse näher ins Auge fassen will, aber aus der standard­mäßigen Darstellung der Eigenschaften und Methoden nicht schlau wird. In diesem Fall hilft dieser Befehl:

    Get-CimClass -ClassName Win32_OperatingSystem | select -ExpandProperty CimClassProperties

    Mit dem Parameter ExpandProperty löst Select-Object die kompakte Darstellung in eine Liste auf, die auch Detail­informationen zu den Attributen enthält. Möchte man ihn auf Methoden anwenden, dann ersetzt man im obigen Beispiel CimClassProperties durch CimClassMethods.

    Keine Kommentare