Windows Management Instrumentation (WMI)

WBEM, oder auch Web-Based Enterprise Management ist ein Ansatz um Administration und Fernwartung in großen Netzwerken (Unternehmen) zu standardisieren.

Microsoft preschte schon vor den 2000ern mit seiner eigenen COM-Implementierung davon vor, nannte es WMI und deshalb haben wir heute zu vielen Systemkonfigurationen primär nur über die WMI-Schnittstellen Zugang.

Die meisten kennen WMI vom Windows Scripting Host und nehmen es als “seltsam” wahr.
Einerseits ist die Menge an Funktionen und Möglichkeiten erschlagend groß, andererseits läuft vieles über eine SQL-ähnliche Abfragesprache.

1Computer = "."
2Set objService = GetObject("WinMgmts:{impersonationLevel=impersonate,(Shutdown)}!\\" & Computer & "\root\cimv2")
3
4Set objSystems = objService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
5For Each objSystem in objSystems
6  objSystem.Shutdown()
7Next

Das Beispiel zeigt, wie man einen PC herunter fährt.

  1. Man verbindet sich zum WMI-Dienst (mit ein paar Angaben, dass z.B. das Shutdown-Privileg gebracht wird)
  2. Man empfängt die Liste aller “laufenden” Betriebssystem aus der Klasse “Win32_OperatingSystems”
    • würde mich sehr wundern, wenn da jemals mehr als eine Instanz zurück käme
  3. Auf allen Instanzen wird die “Shutdown()” Methode ausgeführt.

Theoretisch kann man über die String-Variable Computer auch den DNS oder NETBIOS Namen eines anderen Systems angeben, oder mit . auf das lokale System verweisen. Das war unter Windows XP noch Gang und Gäbe, doch heute lassen Firewall und DCOM-Einstellungen das nicht mehr so ohne weiteres zu und man ist auf das lokale System beschränkt.

WMI hat primär eine COM-Schnittstelle die (wie wir im Beispiel sahen), auch Sript-fähig ist, also mit dem IDispatch Interface arbeitet.
Doch seit Einführung von dotNet und etwas später der Powershell, sind die alten VBScripts kaum mehr anzutreffen (obwohl sie noch brav funktionieren).

Außerdem stellt WMI in bestimmten Situationen Zugänge bereit, für die es keine anderen APIs gibt.
Das IP-Adressen Setup ist so ein Bereich, wo über die Instanzen der WMI-Klasse Win32_NetworkAdapterConfiguration über die Methoden EnableStatic, SetGateways, EnableDNS, EnableDHCP.

Doch was für mich gerade hoch spannend ist, ist die Tatsache, dass der Hyper-V Service ebenfalls primär über WMI ansteuerbar ist. Und da Microsoft ja auch den kostenlosen “Nur-Hyper-V” Server zum Download anbietet, interessiere ich mich sehr für dessen Verwaltung um ein paar kleine Tools dafür zu schreiben.

Doch es gibt noch weitere Gebiete, die nur eine WMI Schnittstelle bieten:
z.B. Die Ansteuerung des Unified Write Filters unter Windows 10 IoT Enterprise. Während der alte Enhanced und File-based Write Filter in Windows 7 Embedded noch seine eigene C-API mitbrachte, ist aber Windows 10 WMI neben der Kommandozeile die einzige Möglichkeit, dieses Feature zu verwalten.

Fazit

WMI ist bietet zu extrem vielen Bereichen Zugänge, die nicht im entferntesten alle auf einer Blog-Seite erwähnt werden können. Sogar Dateisuchen lassen sich über WQL - die WMI Query Language abbilden.

Folglich kommt System-Tool Programmierer an dieser essentiellen Technologie unter Windows vorbei.


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!