Get-WmiObject: PowerShell für WMI-Abfragen nutzen


    Tags: ,

    Mittels Windows Management Instrumentation (WMI) lässt sich eine Fülle von Informationen über einen Rechner abrufen, von seiner Hardware- und Softwareausstattung über Log-Einträge bis zu den User-Konten. Für WMI-Abfragen aller Art ist in PowerShell Get-WmiObject zuständig, das im Zusammenspiel mit anderen Cmdlets die ermittelten Daten nach Belieben aufbereiten und ausgeben kann.

    Im Vergleich zu anderen WMI-Bordmitteln von Windows hat PowerShell nicht nur den Vorteil, dass sie mächtiger und flexibler ist, sondern dass mit ihr die Nutzung von WMI auch wesentlich einfacher ist als mit VBS-Scripts. Das Kommandozeilen-Tool wmic erspart dem Anwender dank vieler vordefinierter Aliase zwar den direkten Kontakt mit den WMI-Klassen, aber es bieten sich anschließend nur relativ beschränkte Möglichkeiten zur Weiter­ver­arbei­tung der Daten.

    Unkomplizierter Aufruf für einfache Klassen

    In der einfachsten Form ruft man Get-WmiObject nur zusammen mit einer WMI-Klasse auf, wobei man sich beim interaktiven Einsatz auf der Kommandozeile durch die Verwendung des Alias gwmi Tipparbeit sparen kann:

    Get-WmiObject Win32_BIOS

    Folgt die WMI-Klasse direkt auf den Aufruf des Cmdlets, dann kann der Parametername -class entfallen. Weglassen kann man in den meisten Fällen auch den Parameter -namespace, weil dieser auf root\cimv2 voreingestellt ist und damit den meisten Anforderungen entspricht.

    WMI-Klassen und Eigenschaften von Objekten anzeigen

    Vor der erfolgreichen Abfrage der gewünschten Daten ist es oft notwendig, sich in der WMI-Komplexität zurechtzufinden. Das betrifft nicht nur die Suche nach der passenden Klasse, sondern auch Informationen über die Eigenschaften der zurückgegebenen Objekte.

    Um sich die verfügbaren WMI-Klassen eines Namespaces anzeigen zu lassen, verwendet man den Parameter -list. Gibt man den Namespace nicht explizit an, dann erhält man alle Klassen unterhalb von root\cimv2. Diese Liste ist jedoch sehr lang, so dass man sie in der Regel über bestimmte Suchbegriffe eingrenzen möchte:

    gwmi -list|where {$_.name -like "*disk*"}

    Dieser Aufruf würde alle Klassen anzeigen, in deren Namen die Zeichenkette disk enthalten ist. Wenn man dann überprüfen möchte, ob eine bestimmte Klasse die gesuchten Eigenschaften enthält, dann kann man das über Get-Member herausfinden:

    gwmi Win32_DiskDrive | Get-Member

    WMI-Ergebnisse filtern

    Wenn man dann Get-WmiObject mit einer bestimmten Klasse aufruft, dann erhält man fast immer weit mehr Informationen zurück, als man überschauen oder gar brauchen kann. Das gerade oben angeführte Beispiel Win32_DiskDrive verfügt über 67 Eigenschaften und Methoden. Daher wird man zumeist bestimmte Objekte herausfiltern wollen und von den verbliebenen nur ausgewählte Eigenschaften anzeigen.

    WMI verfügt über eine SQL-ähnliche Abfragesprache namens WQL, die man etwa in wmic-Aufrufen oder VBS-Scripts einsetzt, um die Ergebnisse auf die gewünschten Objekte und Eigenschaften einzuschränken.

    WQL-Statements meist nicht nötig

    Ihre Verwendung ist auch mit Get-WmiObject möglich, indem man dem Cmdlet das WQL-Statement über den Parameter -query übergibt. Die Beschäftigung mit WQL ist in der Regel aber nicht notwendig, weil man gwmi die Filterkriterien auch direkt mitteilen kann:

    gwmi Win32_process -filter "name='chrome.exe'" | select CommandLine,ProcessID | fl

    Dieses Beispiel ruft die Liste der aktiven Prozesse ab und filtert jene aus, bei denen die Eigenschaft Name den Wert chrome.exe haben. Da wir nur daran interessiert sind, in welcher Form das Programm aufgerufen wurde und wie seine Prozess-ID lautet, beschränken wir das Ergebnis mit Hilfe von Select-Object (Alias Select) auf diese Eigenschaften. Schließlich dient Format-List (Alias fl) dazu, das Resultat in Listenform darzustellen.

    Remote-PCs abfragen

    Ruft man Get-WmiObject wie in den obigen Beispielen auf, dann bezieht sich die Abfrage auf den lokalen Rechner. Das Cmdlet unterstützt jedoch PowerShell Remoting, so dass über den Parameter -Computername (Kurzform: -computer) der Name eines oder mehrerer Zielrechner übergeben werden kann:

    gwmi Win32_process -filter "name='chrome.exe'" -computer RemotePC

    Betrifft die Abfrage mehrere PCs, dann notiert man ihre Namen als Komma-separierte Liste.

    1 Kommentar

    Bild von Gast1234234
    Gast1234234 sagt:
    14. Oktober 2014 - 21:05

    Und wie kann ich per UPnP die externe IP eines Routers mit WMI bzw. WMIC anzeigen?