Verwenden des Cmdlet \"Get-WMiObject\"

Abrufen von Daten mit Hilfe von WMI

Momentan gibt es nur ein paar wenige Cmdlets (Get-Process, Get-Service und Get-EventLog), die für Aufgaben der Systemverwaltung vorgesehen sind. Aus diesem Grund bleibt WMI die wichtigste Automatisierungstechnologie für die Systemverwaltung, so dass sich die Systemadministratoren bei Routineaufgaben wahrscheinlich weitgehend auf Get-WmiObject verlassen.

Und es gibt noch einen Bonus: Anders als die meisten Cmdlets kann Get-WmiObject für Remotecomputer ausgeführt werden. Das bedeutet, dass Sie Windows PowerShell auch als Verwaltungstool nutzen können.

Standardmäßig stellt Get-WmiObject eine Bindung zum Namespace "root\cimv2" auf dem lokalen Computer her, wodurch Eigenschaftswerte einer in "cimv2" enthaltene Klasse auf einfachste Weise zurückgeben werden können. Nehmen wir beispielsweise an, Sie brauchen Informationen aus der Klasse "Win32_BIOS". Kein Problem:

Get-WmiObject win32_bios

Sie haben es sicher schon verstanden: Sie rufen einfach Get-WmiObject gefolgt von dem Klassennamen auf. Das also ist klar, aber was passiert, wenn sich diese Klasse auf einem Remotecomputer befindet? Ganz einfach. Sie fügen den Parameter –computername gefolgt vom Namen des Remotecomputers ("atl-fs-01") hinzu:

Get-WmiObject win32_bios -computername atl-fs-01

Immer noch nicht überzeugt? Gut: Wir haben gesagt, dass Get-WmiObject standardmäßig eine Verbindung zum Namespace "root\cimv2" herstellt. Gibt es eine Möglichkeit, eine Verbindung zu einer in einem anderen Namespace enthaltenen Klasse herzustellen? Aber natürlich: Sie fügen einfach nur den Parameter –namespace ein, gefolgt von dem vollständigen Pfad zu dem gewünschten Namespace (z. B. "root\ccm", nicht nur "ccm"). Der folgende Befehl gibt beispielsweise Informationen aus der Klasse "SMS_Client" zurück, die sich im Namespace "root\ccm" befindet:

Get-WmiObject -namespace root\ccm -class sms_client -computername atl-fs-01

Vermutlich muss nicht erwähnt werden, dass Sie in Kombination mit Get-WmiObject auch andere Cmdlets verwenden können (obwohl wir es hier trotzdem erwähnen). Der folgende Befehl beispielsweise ruft Informationen aus der Klasse "CCM_InstalledComponent" für den Remotecomputer "atl-fs-01" ab. Anschließend leitet der Befehl diese Daten zum Cmdlet Select-Object weiter, das alle bis auf drei Eigenschaften herausfiltert: DisplayName, Name und Version. Diese gefilterten Daten wiederum werden an Sort-Object weitergereicht, das die Informationen nach "DisplayName" sortiert. Und so sieht der Befehl aus:

get-wmiobject -namespace root\ccm -class ccm_installedcomponent -computername atl-fs-01 | Select-Object displayname,name,version | Sort-Object displayname

Die zurückgegebenen Daten können wie folgt aussehen:

displayname                name                       version
-----------                ----                       -------
CCM Framework              CcmFramework               2.50.4160.2000
CCM Policy Agent           CcmPolicyAgent             2.50.4160.2000
CCM Status Agent           CcmStatusAgent             2.50.4160.2000
SMS Client Core Components SmsClient                  2.50.4160.2000
SMS Inventory Agent        SmsInventory               2.50.4160.2000
SMS Remote Control Agent   SmsRemoteTools             2.50.4160.2000
SMS Shared Components      SmsCommon                  2.50.4160.2000
SMS Software Distributi... SmsSoftwareDistribution    2.50.4160.2000
SMS Software Metering A... SmsSoftwareMetering        2.50.4160.2000
SMS Software Update Agent  SmsSoftwareUpdate          2.50.4160.2000
SMS Source List Update ... SmsSourceUpdateAgent       2.50.4160.2000

Andererseits gibt es wahrscheinlich Situationen, in denen Sie keine gefilterte Menge der Eigenschaften und ihrer Werte benötigen. Stattdessen wollen Sie einfach alles sehen, was "Win32_BIOS" anzubieten hat. Um sicherzustellen, dass Sie Informationen über alle Eigenschaften (und deren Werte) zurückerhalten, leiten Sie die von Get-WmiObject zurückgegebenen Daten zum Cmdlet Select-Object weiter und wenden dann das Platzhalterzeichen "*" an, damit alle Eigenschaftswerte zurückgegeben werden:

Set-WmiObject win32_bios | Select-Object *

Wenn Sie nicht alle Systemeigenschaften benötigen (wie etwa __SUPERCLASS und __RELPATH), fügen Sie den Parameter –excludeproperty hinzu und verwenden das Platzhalterzeichen, um Eigenschaften herauszufiltern, deren Namen mit einem Unterstrich beginnen:

Get-WmiObject win32_bios | Select-Object -excludeproperty "_*"

Zusätzlicher Tipp. WMI selbst ist relativ einfach zu benutzen. Nicht ganz so einfach ist es häufig, die Eigenschaften und Methoden für eine bestimmte WMI-Klasse zu ermitteln. Und nun überzeugen Sie sich selbst, was gemeinhin als schwierig bezeichnet wird. Mit Windows PowerShell und Get-WmiObject stellen Sie einfach eine Verbindung zu der betreffenden Klasse her (z. B. "Win32_BIOS") und leiten die Informationen zum Cmdlet Get-Member weiter:

Get-WmiObject win32_bios | get-member

Und wofür ist das gut? Mit diesem Befehl können Sie die Eigenschaften und Methoden von "Win32_BIOS" anzeigen, wie unter anderem:

BiosCharacteristics       Property              System.UInt16[] BiosCharacte...
BIOSVersion               Property              System.String[] BIOSVersion ...
BuildNumber               Property              System.String BuildNumber {g...

Usw.

Aliase für "Get-WmiObject"

  • gwmi