WMI-Scripting

Installierte Software

Über WMI lassen sich auch Informationen zur installierten Software ermitteln. Ein Beispiel dafür liefert Listing 7.

Listing 7: Die Abfrage der installierten Software (Quelle:
Microsoft)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("c:\scripts\software.tsv", True)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
("SELECT * FROM Win32_Product")
objTextFile.WriteLine "Caption" & vbtab & _
"Description" & vbtab & "Identifying Number" & vbtab & _
"Install Date" & vbtab & "Install Location" & vbtab & _
"Install State" & vbtab & "Name" & vbtab & _
"Package Cache" & vbtab & "SKU Number" & vbtab & "Vendor" & vbtab _
& "Version"
For Each objSoftware in colSoftware
objTextFile.WriteLine objSoftware.Caption & vbtab & _
objSoftware.Description & vbtab & _
objSoftware.IdentifyingNumber & vbtab & _
objSoftware.InstallLocation & vbtab & _
objSoftware.InstallState & vbtab & _
objSoftware.Name & vbtab & _
objSoftware.PackageCache & vbtab & _
objSoftware.SKUNumber & vbtab & _
objSoftware.Vendor & vbtab & _
objSoftware.Version
Next
objTextFile.Close

In diesem Fall werden die Informationen in eine Textdatei geschrieben, was beispielsweise auch für das Auslesen von Ereignissen eine sinnvolle Lösung ist. Wichtig ist vor allem die Klasse, auf die zugegriffen wird. In diesem Fall wird mit Win32_Product gearbeitet. Diese Klasse gehört zu der großen Gruppe der Installed Application Classes, also von Klassen rund um das Management von installierten Anwendungen.

Zu den Methoden dieser Klasse gehören unter anderem:

  • Install für die Installation neuer Anwendungen.

  • Reinstall für das erneute Ausführen des Insallationsprogramms.

  • Upgrade für die Aktualisierung des Produkts.

  • Uninstall für die Deinstallation.

Mit den verschiedenen Methoden und Eigenschaften lässt sich die Software auf Systemen nicht nur effizient inventarisieren, sondern auch konfigurieren. In den meisten Fällen wird man dazu zwar spezialisierte Lösungen für die Softwareverteilung verwenden, das Scripting kann aber beispielsweise für die Erweiterung solcher Lösungen oder für spezielle Anwendungen hilfreich sein.

Laufende Prozesse

Mit Hilfe von WMI kann aber nicht nur überprüft werden, welche Anwendungen vorhanden sind. Auch die laufenden Anwendungen, also die Prozesse, können abgefragt werden. Es gibt beispielsweise im Resource Kit verschiedene Tools, mit denen sich Prozessinformationen ermitteln lassen. Solche Tools lassen sich mit WMI-Skripts relativ einfach selbst entwickeln und bieten dann exakt die Funktionalität, die benötigt wird. Das Listing 8 zeigt ein Beispiel für ein solches Skript. Das Skript ist noch sehr „minimalistisch“ in seiner Form. Es ermittelt nur, ob ein Prozess läuft oder nicht. Dazu wird die Eigenschaft Count verwendet, die die Anzahl der laufenden Prozesse ausgibt. Auch hier lohnt sich wieder ein Blick auf die Methoden und Eigenschaften sowie die verwandten Klassen. Bei den Methoden findet sich unter anderem Terminate, mit der ein bestimmter Prozess beendet werden kann. Mit SetPriority kann sogar, entsprechende Berechtigungen vorausgesetzt, die Priorität eines Prozesses verändert werden. Wichtig sind aber vor allem die Eigenschaften. Hier gibt es unter anderem Kernel-ModeTime für die Ausführungszeit im Kernel-Modus des Betriebssystems, PeakWorkingSetSize für den maximal konsumierten Hauptspeicher,
ThreadCount für die Anzahl der Threads in diesem Prozess oder WriteOperationCount für die Anzahl der durchgeführten Schreiboperationen – also viele Eigenschaften, mit denen sich Details zum Verhalten des Prozesses, zur Speichernutzung und zur Performance erfragen lassen.

Listing 8: Skript für den Zugriff auf Prozessinformationen
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'iexplore.exe'")
If colProcesses.Count = 0 Then
Wscript.Echo "Anwendung läuft nicht."
Else
Wscript.Echo "Anwendung läuft."
End If


Neben verschiedenen anderen Klassen, mit denen weitere Informationen zu Prozessen ermittelt und ausgeführte Prozesse überwacht werden können, ist vor allem noch die Klasse Win32_Thread interessant. Über diese kann auf Daten zu den Threads, also den Ausführungseinheiten innerhalb von Prozessen, zugegriffen werden. Die Zuordnung zwischen Prozessen und Threads erfolgt über die Eigenschaften Handle der Klasse Win-32_Process beziehungsweise ProcessHande der Klasse Win32_Thread.