WMI

WMI ist die Kurzform für "Windows Management Instrumentation" und ist die Umsetzung des WBEM-Standards (Web Based Enterprise Management ) von Microsoft für Windows. Ziel ist ein einfacher Zugriff auf Systeminformationen. WMI wird sehr viel häufiger eingesetzt, auch wenn Sie als Administrator davon eigentlich nicht viel bemerken.

Exchange und WMI
Mit Exchange 2000 wurde erstmals die WMI-Unterstützung eingeführt und mit Exchange 2003 noch mal erweitert. Leider wurde ab Exchange 2007 der WMI-Zugang wieder reduziert. Hier ist dann wohl die PowerShell bzw. die Commandlets und .NET-Komponenten der nächste Entwicklungsschritt.

Das WMI-System auf Windows 2000 und höher kann bei Bedarf auch auf Windows NT4 installiert werden und erlaubt einen definierten Zugriff sowohl lesend als auch schreibend auf fast alle Einstellungen eines Systems. Auch durch die Installation von Exchange wird das WMI-System durch Exchange spezifische Ergänzungen erweitert. Als Administrator aber auch als Programmierer sollten Sie WMI besser heute als morgen können lernen.

Was kann WMI?

Die Frage sollte besser lauten, was könne Sie über WMI tun und erreichen, denn WMI alleine macht erst einmal nichts, sondern stellt nur eine definierte Schnittstelle bereit. Über diese können Sie aber z.B.:

  • Eventlogs lesen, zurücksetzen, einstellen
  • Hardware und Software Inventardaten auslesen
  • Systemparameter lesen und schreiben
  • Programme starten
  • Exchange Mailboxgrößen abfragen
  • Performancecounter abfragen
  • Exchange Warteschlangen anhalten und wieder starten.
  • Dienste abfragen, starten, beenden.
  • Und noch vieles mehr

Und das ist nur eine Auswahl der Vielzahl an Möglichkeiten.

Verwalten

Natürlich darf nicht jeder nun per WMI auf dem Server oder auch entfernt über das Netzwerk auf die Daten zugreifen und diese verändert. WMI unterstützt die Vergabe von Berechtigungen. Dazu gibt es eigene Konsole zur Vergabe von Berechtigungen und Konfiguration von WMI.

Sie sehen hier sehr gut, dass WMI eine ähnliche Baumstruktur benutzt, wie ein Dateisystem oder die Registrierung. Als Teil des Baums ist auch gut zu sehen, dass es einen Pfad "MSAPPS11" und MSAPPS10 gibt, was der erfahrene Administrator natürlich direkt auf Office zurückführen wird. Tatsächlich ist WMI nicht nur für Serveranwendungen, sondern auch auf jedem Desktop vorhanden.

WMI Updates und Hotfixes

WMI ist eine zentrale Komponente von Windows und sehr viele Programme greifen auf WMI für Abfragen oder Einstellungen zu. Dennoch kann es sein, dass der ein oder andere Zugriff dann nicht sauber beendet wird oder WMI immer mehr speicher verwendet. WMI nutzt schon einen Service Host, welcher entsprechender Tochterprozesse startet, die dann im Taskmanager als WMIPSRV.EXE-Prozesse erscheinen und im Fehlerfall bis zu 500 MB Speicher belegen. Dann allerdings nicht weiter wachsen, da diese Prozess ein 500MB-Limit haben aber eben nicht mehr sauber funktionieren.

In der Regel sind diese Probleme bekannt und durch einen Hotfix zu beheben, der aber nicht über Windows Updates kommen. Selbst Windows 2008 R2 hat einen Bug, der erst durch einen Hotfix, der mittlerweile aber auch in das Service Pack 1 eingeflossen ist, gelöst wird.

Eine Suche nach entsprechenden Hinweisen in der TechNet oder MSDN sollte eventuell sinnvolle Updates aufführen.

WMI reparieren

Die Funktion von WMI hängt stark von dem Dienst selbst, den registrierten DLLs und den dazugehörigen MIF und MOF-Dateien ab. Sehr oft habe ich das Problem, dass auf einem Server WMI "irgendwie" nicht mehr funktioniert. Dann kann es helfen, WMI zurückzusetzen. Dazu gibt es mehrere Wege, die unterschiedlich "tief" gehen. Vorher steht aber die Analyse und Diagnose an. Und da gibt es seit einiger Zeit von Microsoft ein VBScript WMIDIAG:

The WMI Diagnosis utility -- Version 2.0
http://www.microsoft.com/downloads/details.aspx?familyid=d7ba3cd6-18d1-4d05-b11e-4c64192ae97d&displaylang=en

Laden Sie sich das Paket herunter. Das EXE packt sich in ein anzugebendes Verzeichnis aus. Starten Sie dann einfach in einer CMD-Box

cscript wmidiag.vbs

Das Skript prüft WMI und öffnet im Anschluss einen Bericht in Notepad. Hier finden Sie eigentlich alles, um den Fehler einzukreisen. Vielleicht fehlt ja nur eine Datei oder wurde ein Recht verändert. Ansonsten sollten Sie sich über die Möglichkeiten einer Lösung schlau machen. Dazu rate ich zu folgendem Artikel:

Ansonsten hier noch ein paar Befehle, die helfen könnten.

  • Repository neu aufbauen (Nur Windows XP und Vista)
    Das ist die einfachste Lösung. Man stoppt WMI, benennt das Repository um und startet den Server. Dieser Neustart dauert aber dann erst mal etwas länger, da der Server das Repository neu aufbaut.
net stop winmgmt
rename %windir%\System32\Wbem\Repository Repository.bad
net start winmgmt
  • Repository per Befehlszeile neu aufbauen
    Neuere Versionen von Windows erlauben auch eine Reparaturinstallation. Das entspricht der Installation von Windows. Daher benötigen Sie auch die Quelldatenträger.
WinXP SP2:   rundll32 wbemupgd, upgradeRepository
Vista:       winmgmt /salvagerepository
Windows 200: rundll32 wbemupgd, RepairWMISetup
  • WMI-Komponenten neu registrieren
    Hierbei werde alle vorhandenen Dateien neu registriert. Fehlende Dateien werden jedoch nicht wieder hergestellt.
cd /d %windir%\system32\wbem
for %i in (*.dll) do RegSvr32 -s %i
for %i in (*.exe) do %i /RegServer
  • Installation reparieren
    Neuere Versionen von Windows erlauben auch eine Reparaturinstallation. Das entspricht der Installation von Windows. Daher benötigen Sie auch die Quelldatenträger.
rundll32.exe setupapi,InstallHinfSection WBEM 132 %windir%\inf\wbemoc.inf

Sie sehen also, das sie WMI eigentlich nie wirklich sehen, aber es bei Problemen sehr steinig werden kann. Ich habe auch schon erlebt, dass die erneute Installation des letzten Service Packs wahre wunder wirkt

WMIC

Für einfache WMI-Abfragen liefert Microsoft eine Kommandozeile für WMI mit. Die WMI Console oder kurz: WMIC. WMIC können Sie einfach so über "Start - Ausführen" starten sogar die

WMIC ist hingegen eine einfache Kommandozeile, mit der sie bekannte Werte einfache abfragen könnten. So liefert nach der Eingabe von "CPU" die WMIC einfach die Liste der installierten CPUs it ihren Daten

Über WMIC können aber auch Parameter gesetzt werden. Besonders Netzwerkkarten lassen sich damit per Skript umstellen, was für Leute wie mich manchmal hilfreich ist um meine Netzwerkkarte auf dem Notebook oder aber auch in VMs schnell umzustellen. Hier ein paar Beispiele:

REM Auflisten
WMIC NICCONFIG LIST

REM  IP-Adresse + Subnetz aender
WMIC NICCONFIG WHERE macaddress="00:1D:E0:6F:B3:83" CALL EnableStatic ("172.16.1.100"),(255.255.0.0)

REM  IP-Adresse + Subnetz per DHCP beziehen
WMIC NICCONFIG WHERE macaddress="00:1D:E0:6F:B3:83" CALL EnableDHCP

REM Gateway ändern
WMIC NICCONFIG WHERE macaddress="00:1D:E0:6F:B3:83" CALL SetGateways ("172.16.1.1"),(1)

REM DNS-Server ändern
WMIC NICCONFIG WHERE macaddress="00:1D:E0:6F:B3:83" CALL SETDNSSERVERSEARCHORDER ("172.16.1.2","172.16.1.3")

REM Festplattenfuellung anzeigen (Scheint auf Win2008R2 nicht mehr zu klappen)
WMIC DISKDRIVE get Capacity,Caption,Filesystem,Freespace,Label,Name,Serialnumber,SystemName /format:csv

Die Einstellungen gelten natürlich immer nur für die angegebene Netzwerkkarte. Die komplette Beschreibung von WMIC ist in der Windows Online Hilfe verfügbar.

Wenn Sie aber wirklich mit WMI loslegen wollen, dann sollten Sie WMI als Programmierer betrachten.

WMI Tools

Microsoft selbst hat ein paar WMI-Tools zum Download bereit gestellt, mit denen Sie sehr elegant die Informationen betrachten können, die WMI ihnen bereit stellt.

Die Tools umfassen folgende Programme:

Als erstes sollten Sie sich für den WMI Object Browser interessieren, welcher ihnen lesenden Zugriff auf alle vorhandenen Objekte gibt. Ich habe mal eine Auswahl getroffen und hier abgebildet. Auf Notebooks können Sie per WMI den Ladezustand ihres Akku ebenso abfragen wie die Drehzahl von Lüftern. Auf Servern ist vermutlich eher der Status der uSV und des Festplattensubsystems interessant. Aber Sie können ebenso das Windows NT Eventlog oder Performance Counter per WMI abfragen.

Perfmon und WMI

Auch die Windows Performance Counter (Perfmon) sind über WMI erreichbar und können über diesen Weg auch einfach aus VBScript abgefragt. Werden. Welche Counter Sie per WMI erhalten, können Sie aber auch mit PERMON selbst erkennen. Sie müssen dazu nur Perfmon mit der Option "/WMI" starten.

WMI und SNMP

Über den WMI-SNMP Provider ist es sogar möglich, über die WMI-Funktion eines Systems beliebige SNMP-Counter eines anderen Systems abzufragen. Dazu müssen Sie auf einem Server nur diesen Provider über "Systemsteuerung - Software -  Windows Komponenten" installieren:

Bei Windows 2000 muss dazu das Programm "Wbemsnmp.exe" aus %windir%System32\wbem Verzeichnis oder aus dem \i386-Installationverzeichnis ausgeführt werden. Windows 95/98 oder NT4 sind nicht geeignet. Allerdings ist dann nur innerhalb von WMI ein SNMP-Zweig vorhanden.

 Es sind noch einige Schritte zusätzlich erforderlich, um z.B.: die MIB-Dateien der SNMP-Konfiguration zu MOF-Dateien zu konvertieren und dann zu importieren. Die genaue Beschreibung finden Sie z.B. in der MSDN

VBScript

Interessant wird der Einsatz von WMI in eigenen Programmen, z.B.: mit VBScript. Ein paar einfache Zeilen reichen, um z.B. per VBscript bestimmte Informationen auszulesen und zur Weiterverarbeitung bereit zustellen. Da kommt ihnen sicherlich der Gedanken eine kleine Inventarisierung für ihre ganzen PCs zu schreiben und diese z.B.: über eine Gruppenrichtlinie auf allen PCs laufen zu lassen. Da ASP nicht sehr weit von VBScript entfernt ist, können Sie auch eine ASP-Seite auf ihrem Webserver ablegen, und über einen Browser z.B.: die Länge der Warteschlangen ihres Exchange Servers anzeigen lassen. Das ist alles kein Hexenwerk sondern Beispiele aus der Realität. Hier ein keiner VBScript-Schnipsel

Set objWMIService = GetObject("winmgmts:\\SRV01\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfRawData_MSExchangeIS_MSExchangeISMailbox",,48)
For Each objItem in colItems
    Wscript.Echo "ActiveClientLogons: " & objItem.ActiveClientLogons
    Wscript.Echo "AverageDeliveryTime: " & objItem.AverageDeliveryTime
    Wscript.Echo "AverageLocalDeliveryTime: " & objItem.AverageLocalDeliveryTime
    Wscript.Echo "ClientLogons: " & objItem.ClientLogons
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "FolderOpensPersec: " & objItem.FolderOpensPersec
    Wscript.Echo "Localdeliveries: " & objItem.Localdeliveries
    Wscript.Echo "Localdeliveryrate: " & objItem.Localdeliveryrate
    Wscript.Echo "MessagesSentPermin: " & objItem.MessagesSentPermin
    Wscript.Echo "MessagesSubmittedPermin: " & objItem.MessagesSubmittedPermin
    Wscript.Echo "ReceiveQueueSize: " & objItem.ReceiveQueueSize
    Wscript.Echo "SendQueueSize: " & objItem.SendQueueSize
Next

Im wesentlichen auch nur ein Zugriff auf die Performance Counter.

Folgende Links helfen ihnen beim Einstieg:

Auch eine Suche in der TechNet und Knowledgebase nach WMIC liefert ihnen jede Menge Treffer und Hilfestellungen. Einige Skripte der MSXFAQ nutzen ebenfalls WMI, wie z.B.: RUSMon.

Soundping soundping.vbs.txt
Kleines VBScript, welches eine angegeben Adresse permanent per PING prüft und bei Nichterreichen alle 2 Sekunden einen Piep abgibt und bei erneuter Erreichbarkeit alle 5 Sekunden einen "Dreifachpiep" abgibt. Damit überwache ich z.B. Server, bei denen ich einen Neustart aus der Ferne angestoßen habe, um zu "hören", wenn diese endlich runtergefahren sind und ab wann sie wieder erreichbar sind.

WMI mit PowerShell (Get-WMIObject oder gwmi)

Natürlich ist auch die PowerShell mit WMI nutzbar. Hier ein paar Beispiele:

# Alle Netzwerkkarten auf DHCP umstellen

$lanboard = Get-WmiObject Win32_NetworkadapterConfiguration -Filter "IPEnabled=true"
$lanboard[1] | gm

$nic=$lanboard[1]
$nic.enableDHCP

Interessant sind z.B. Methoden wie "EnableDHCP()".

Aber auch für die Überwachung können sie mit einem Einzeiler einen kompletten Server mit dessen Mountpoints untersuchen und sogar einen eigenen Status errechnen.

gwmi win32_volume -Filter " DriveType = 2 or DriveType = 3" | `
    select name,label,@{Name="FreeGB";Expression={"{0:N0}" -f ($_.freespace/1GB)}}, `
              @{Name="TotalGB";Expression={"{0:N0}" -f ($_.capacity/1GB)}}, `
              @{Name="Critical";Expression={$_.freespace -le 10GB}}, `
              @{Name="PercentFree";Expression={"{0:n2}" -f(($_.freespace / $_.Capacity) * 100)}} | ft

Beachten Sie dazu auch die Seiten:

Und natürlich viele Beispiele im Internet.

WMI und Uhrzeit

Alle von WMI zurück gegebenen DateTime Felder haben ein sehr kryptisches Format. Folgende Funktion konvertiert dieses in ein von VBScript verwendbares Zahlenformat:

Function WMIDateStringToDate(dtmWMIDate)
    If Not IsNull(dtmWMIDate) Then
        WMIDateStringToDate = CDate(Mid(dtmWMIDate, 5, 2) & "/" & _
            Mid(dtmWMIDate, 7, 2) & "/" & Left(dtmWMIDate, 4) _
            & " " & Mid (dtmWMIDate, 9, 2) & ":" _
            & Mid(dtmWMIDate, 11, 2) & ":" & Mid(dtmWMIDate,13, 2))
    End If
End Function

WMI und Throttling

Zumindest auf Windows 2008 habe ich es schon erlebt, dass eine Anwendung, die per WMI viele Daten ausliest wie z.B. TrackLoginEvents nach einiger Zeit sehr langsam wird. Das liegt dann wohl an einem Selbstschutz, mit der WMI sich gegen zu viele Anfragen schützt. (DoS Schutz)

Skripte der MSXFAQ, die WMI verwenden

Die ist nur eine kleine Auswahl

Weitere Links