Aktualisieren von WMI-Daten in Skripts
In Überwachungsskripts können Sie aufeinander folgende Aufrufe von GetObject vermeiden, indem Sie ein SWbemRefresher-Objekt verwenden. Das SWbemRefresher-Objekt ist ein Container für mehrere WMI-Objekte, deren Daten in einem Aufruf aktualisiert werden können.
Die Verwendung eines SWbemRefresher-Objekts ist erforderlich, um fehlerfreie Daten aus WMI-Leistungsklassen wie Win32_PerfFormattedData_PerfDisk_LogicalDisk oder anderen vorinstallierten Klassen abzurufen , die von Win32_Perf abgeleitet sind.
Im folgenden Verfahren wird beschrieben, wie Daten in Skripts aktualisiert werden.
So aktualisieren Sie Daten in Skripts
Rufen Sie CreateObject auf, um ein SWbemRefresher-Aktualisierungsobjekt zu erstellen.
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Stellen Sie eine Verbindung mit dem WMI-Namespace her. Um vorinstallierte Win32_Perf-Leistungsklassen zu verwenden, stellen Sie eine Verbindung mit root\cimv2 her.
Set objServicesCimv2 = GetObject("winmgmts:\\" _ & strComputer & "\root\cimv2")
Fügen Sie der Aktualisierung ein einzelnes Objekt (SWbemRefresher.Add aufrufen) oder eine Auflistung (SWbemRefresher.AddEnum aufrufen) hinzu.
Verwenden Sie die von Win32_PerfFormattedData abgeleiteten vorberechneten Datenklassen, z. B. Win32_PerfFormattedData_PerfDisk_LogicalDisk anstelle von Win32_PerfRawData_PerfDisk_LogicalDisk. Andernfalls müssen Sie die Werte für alle anderen Eigenschaften außer einfachen Zählern berechnen.
Set objRefreshableItem = _ objRefresher.AddEnum(objServicesCimv2 , _ "Win32_PerfFormattedData_PerfProc_Process")
Aktualisieren Sie die Daten einmal, um die anfänglichen Leistungsdaten abzurufen.
Rufen Sie entweder die SWbemRefresher.Refresh-Methode oder die generische SWbemObjectEx.Refresh_-Methode auf.
objRefresher.Refresh
Wenn Sie die Leistung überwachen und über eine Auflistung im Aktualisierungsobjekt verfügen, durchlaufen Sie die Auflistungsobjekte in einer Schleife.
For Each Process in objRefreshableItem.ObjectSet If Process.PercentProcessorTime > 1 then WScript.Echo Process.Name & vbnewLine _ & Process.PercentProcessorTime & "%" End If Next
Löschen Sie die Elemente aus dem Aktualisierungsobjekt, indem Sie SWbemRefresher.DeleteAll aufrufen, oder entfernen Sie bestimmte Elemente, indem Sie SwbemRefresher.Remove aufrufen.
Im folgenden VBScript-Codebeispiel wird gezeigt, wie ein einzelnes Objekt auf dem lokalen Computer aktualisiert wird. Das Skript erstellt einen Aktualisierungscontainer und fügt eine Instanz eines Enumerators für Win32_PerfFormattedData_PerfProc_Process-Instanzen hinzu. Der Aufruf von Refresh erfolgt dreimal, um die Änderungen in der PercentProcessorTime-Eigenschaft für Prozesse zu veranschaulichen, die mehr als ein Prozent der Prozessorzeit beanspruchen.
On Error Resume Next
strComputer = "."
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set objServicesCimv2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err = 0 Then
Set objRefreshableItem = _
objRefresher.AddEnum(objServicesCimv2 ,"Win32_PerfFormattedData_PerfProc_Process")
objRefresher.Refresh
' Loop through the processes three times to locate
' and display all the process currently using
' more than 1 % of the process time. Refresh on each pass.
For i = 1 to 3
Wscript.Echo "Refresh number " & i
objRefresher.Refresh
For Each Process in objRefreshableItem.ObjectSet
If Process.PercentProcessorTime > 1 then
WScript.Echo Process.Name & vbnewLine & Process.PercentProcessorTime & "%"
End If
Next
Next
Else
WScript.Echo Err.Description
End If
Die Index-Eigenschaft des zurückgegebenen SWbemRefreshableItem-Elements stellt den Index des Objekts in der Aktualisierungsobjektauflistung dar. Sie können die SWbemRefreshableItem.IsSet-Eigenschaft aufrufen, um zu bestimmen, ob ein Element in einer Aktualisierung ein einzelnes Element oder eine Auflistung ist. Mit der SWbemRefreshableItem.Object-Eigenschaft können Sie auf ein einzelnes Element zugreifen. Wenn Sie SWbemRefreshableItem.Object nicht aufrufen, schlägt das Skript fehl, sobald Sie versuchen, auf das Objekt zuzugreifen. Verwenden Sie die SWbemRefreshableItem.ObjectSet-Eigenschaft, um auf eine Auflistung zuzugreifen.
Zugehörige Themen