WMI-Scripting

Im abschließenden Teil der Artikelserie liegt der Schwerpunkt beim Zugriff auf Informationen über Softwarekomponenten und Treiber und den entsprechenden Funktionen bei WQL. Aber auch ergänzende Aspekte der Verwendung von WMI beim Scripting werden näher betrachtet.

Nachdem in den ersten beiden Teilen der Serie Grundlagen des WMI-Scriptings und der Umgang mit Hardwareressourcen erläutert wurden, geht es in dieser Folge vor allem um Methoden und Eigenschaften von Softwarekomponenten wie Diensten und Treibern. WMI stellt auch hier umfassende Funktionen zur Verfügung. Außerdem werden noch einige Details erläutert, unter anderem zum Verbindungsaufbau und zur WMI Scripting Library.

Das Beispiel Computerverwaltung

Auch wenn die Computerverwaltung nicht auf Basis von Skripts arbeitet, ist sie doch ein gutes Beispiel für die Möglichkeiten, die WMI bietet – zumindest bei Windows 2000. Dort findet sich noch der Bereich Systeminformationen, in dem Informationen über das System angezeigt werden (Bild 1). Er nutzt WMI, um diese Informationen zu sammeln. Zu den angezeigten Informationen gehören auch detaillierte Daten zur
Softwareumgebung mit den Treibern, Diensten und vielen weiteren Informationen.

Bild 1: In der Computerverwaltung von Windows 2000 werden über WMI viele Systeminformationen ermittelt.
Bild 1: In der Computerverwaltung von Windows 2000 werden über WMI viele Systeminformationen ermittelt.

Solche Informationen lassen sich entsprechend auch über Skripts abfragen, da beim Scripting auf die gleichen Methoden und Eigenschaften zugegriffen werden kann. Entsprechend lassen sich mit vergleichsweise einfachen WMI-Skripts recht umfassende Anwendungen realisieren.

Auf solche Skripts, mit denen beispielsweise auf Dienste, Konfigurationsinformationen des Systems und andere Informationen zugegriffen werden kann, wird nachfolgend eingegangen.

Überblick über die Dienste

Ein erstes einfaches Beispiel findet sich in Listing 1. Mit dem Skript werden die laufenden Dienste abgefragt, in diesem Fall auf dem lokalen System.

strComputer = "."
Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Service")
For Each wbemObject In wbemObjectSet
WScript.Echo "Anzeigename: " & wbemObject.DisplayName & vbCrLf & _
" Status: " & wbemObject.State & vbCrLf & _
" Startart: " & wbemObject.StartMode
Next

Bild 2: Die Ausgabe des Skripts aus Listing 1.
Bild 2: Die Ausgabe des Skripts aus Listing 1.

Das Skript ist wie meist sehr einfach. Es wird auf das lokale System zugegriffen, um dort die Instanzen von Win32_Service zu ermitteln, also eine Liste der Dienste auszugeben. Für jeden Dienst werden drei Informationen abgefragt:

  • Der DisplayName als Anzeigename, also der in der Liste von Diensten sichtbaren Dienstname.

  • Der Status als aktueller Zustand des Dienstes.

  • Der StartMode als die Startart des Dienstes.

Das Skript sollte in jedem Fall mit

cscript skriptname.vbs

aufgerufen werden. Da es sehr viele Dienste gibt, führt die Verwendung von wscript.exe dazu, dass entsprechend viele einzelne Fenster mit Dienstinformationen eingeblendet werden. Natürlich lässt sich das Skript auch eleganter gestalten, indem man beispielsweise einen mehrzeiligen Ausgabetext generiert, wie es in Heft 10/2005 von Expert’s inside Windows NT/2000 an mehreren Beispielen illustriert wurde.

Mit dem einfachen Auflisten sind die Möglichkeiten aber noch lange nicht ausgeschöpft, wie ein Blick auf die Methoden der Klasse Win32_Service zeigt. Die Methoden und Eigenschaften aller Klassen sind unter

http://msdn.microsoft.com/library/en-us/wmidsk/wmi

dokumentiert. Zu den Methoden gehören unter anderem

  • StartService: Mit dieser Methode kann der Dienst gestartet werden

  • StopService: Diese Methode wird verwendet, um einen Dienst zu beenden.

  • ChangeStartMode: Auf diesem Weg kann der Start eines Dienstes verändert werden.

  • Delete: Die Methode wird zum Löschen eines Dienstes eingesetzt.

Gerade das Löschen von Diensten ist von Interesse, weil man gelegentlich bei der Administration vor der Situation steht, dass beim Deinstallieren von Anwendungen nicht alle Dienste korrekt entfernt wurden. Man kann diese nun zwar deaktivieren, sie finden sich aber weiterhin in der Liste der Dienste. Die Methode Delete erlaubt dagegen auch das Entfernen von Diensten aus der Dienstliste. Für die Methode sind umfangreiche Statuscodes definiert, die zurückgeliefert werden. Damit lässt sich innerhalb von Skripts einfach ermitteln, ob der Dienst gelöscht werden konnte und, falls nicht, was die Ursache dafür war.

Neben den verschiedenen Methoden gibt es auch etliche Eigenschaften, die bei Diensten abgefragt werden können. Alle Eigenschaften haben den Zugriffstyp Read-Only, können also nicht verändert werden. Teilweise findet man aber Methoden, mit denen sich Änderungen vornehmen lassen. Dazu zählen die genannte Methode ChangeStartMode und die Methode Change für allgemeine Änderungen an der Konfiguration von Diensten.

Mit den Methoden und Eigenschaften lassen sich beispielsweise Skripts entwickeln, mit denen überprüft wird, ob ein bestimmter Dienst installiert ist. Die Startart kann anschließend auf den gewünschten Wert angepasst werden.