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

  1. Rufen Sie CreateObject auf, um ein SWbemRefresher-Aktualisierungsobjekt zu erstellen.

    Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
    
  2. 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")
    
  3. 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")
    
  4. 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
    
  5. 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
    
  6. 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.

Leistungsindikatorklassen

Zugreifen auf Leistungsdaten im Skript

WMI-Aufgaben: Leistungsüberwachung

Überwachen von Leistungsdaten