Aufrufen einer WMI-Methode

WMI stellt Methoden in der COM-API und der Skript-API bereit, um Informationen zu erhalten oder Objekte in einem Unternehmenssystem zu bearbeiten. Beispielsweise fragt die WMI-Skriptmethode SWbemServices.ExecQuery Daten ab. Anbieter verfügen auch über Methoden, die in den von ihnen registrierten Klassen definiert sind. Beispiele hierfür sind die Win32 _ LogicalDisk-Methoden Chkdsk und ScheduleAutoChk, die vom Win32-Anbieter bereitgestellt werden.

In diesem Thema werden die folgenden Abschnitte erläutert:

WMI-Methoden im Vergleich zu Anbietermethoden

Mithilfe von WMI-Methodenaufrufen in Kombination mit Anbietermethodeaufrufen können Sie Informationen zu Ihrem Unternehmen abrufen und bearbeiten. Weitere Informationen finden Sie unter Aufrufen einer WMI-Methode und Aufrufen einer Anbietermethode.

Die Methoden des WMI-Skriptobjekts SWbemObject haben einen besonderen Status, da sie für jede WMI-Datenklasse gelten können. Weitere Informationen finden Sie unter Skripterstellung mit SWbemObject.

Im folgenden Codebeispiel werden sowohl WMI- als auch Anbietermethoden aufruft.

Die folgenden WMI- und Anbietermethoden befinden sich in der Skripterstellungs-API für WMI:

Sie können den Code, der möglicherweise in "Return" angezeigt wird, im Abschnitt Rückgabecodes für den Win32-Dienst _ nachschauen.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
    Return = objService.StopService()
    If Return <> 0 Then
        Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return 
    Else
       WScript.Echo "Succeeded"
    End If
Next

$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = &quot;Alerter&quot;'
foreach ($objService in $colServices)
{
    $objService.StopService()
}

Method-Calling-Modi in WMI

Der semisynchrone Aufrufmodus bietet in der Regel das beste Gleichgewicht zwischen Sicherheit und Leistung.

Weitere Informationen zu den einzelnen möglichen Modi finden Sie in den folgenden Themen:

Synchroner Modus

Der synchrone Modus tritt auf, wenn das Programm oder die Skripts angehalten werden, bis der Methodenaufruf ein SWbemObjectSet-Auflistungsobjekt zurückgibt. WMI erstellt diese Auflistung im Arbeitsspeicher, bevor das Sammlungsobjekt an das aufrufende Programm oder Skript zurücksendet.

Der synchrone Modus kann sich negativ auf die Programm- oder Skriptleistung auf dem Computer auswirken, auf dem das Programm oder Skript ausgeführt wird. Beispielsweise kann das synchrone Abrufen von Tausenden von Ereignissen aus dem Ereignisprotokoll sehr lange dauern und viel Arbeitsspeicher nutzen, da WMI ein Objekt aus jedem Ereignis erstellt und diese Objekte dann in eine Sammlung einrückt, bevor die Auflistung an die -Methode übergeben wird.

Sie sollten nur Methoden aufrufen, die keine großen Datensätze im synchronen Modus zurückgeben. Die folgenden SWbemServices-Methoden können im synchronen Modus sicher aufgerufen werden:

Alle SWbemServices-Methoden ohne das Wort "Async" im Namen können im synchronen Modus aufgerufen werden, indem der wbemFlagReturnWhenComplete-Wert im iFlags-Parameter angegeben wird.

Asynchroner Modus

Der asynchrone Modus tritt auf, wenn das Programm oder Skript nach dem Aufruf der -Methode weiterhin ausgeführt wird. WMI gibt alle Objekte aus der -Methode an ein SWbemSink-Objekt zurück, wenn jedes Objekt erstellt wird. Das aufrufende Programm oder Skript muss über ein SWbemSink-Objekt und einen SWbemSink.OnObjectReady-Ereignishandler verfügen, um die zurückgegebenen Objekte zu verarbeiten. Weitere Informationen zum Erstellen eines Ereignishandlers für den asynchronen Modus finden Sie unter Empfangen eines WMI-Ereignisses.

In diesem Modus gibt es zwar keine Leistungs- und Ressourcenstrafe des synchronen Modus, der asynchrone Modus kann jedoch zu schwerwiegenden Sicherheitsrisiken führen, da die im SWbemSink-Objekt gespeicherten Ergebnisse möglicherweise nicht aus dem aufrufenden Programm oder Skript stammen. WMI senkt die Authentifizierungsebene für das SWbemSink-Objekt, bis die Methode erfolgreich ist. Weitere Informationen zum Mindern dieser Sicherheitsrisiken finden Sie unter Setting Security on an Asynchronous Call.

Methoden, die mit dem Wort Async angefügt werden, sind Methoden für den asynchronen Modus. Die folgenden Methoden sind asynchrone Aufrufe:

Weitere Informationen zum asynchronen Modus finden Sie unter:

Semisynchroner Modus

Der semisynchrone Modus ähnelt dem asynchronen Modus, da das Programm oder Skript nach dem Aufruf der -Methode weiterhin ausgeführt wird. Im semisynchronen Modus ruft WMI die Objekte im Hintergrund ab, während Ihr Skript oder Programm weiterhin ausgeführt wird. WMI gibt jedes Objekt zurück, das direkt nach dem Erstellen des Objekts an die aufrufende Methode zurückgegeben wird.

Da WMI das Objekt verwaltet, ist der semisynchrone Modus sicherer als der asynchrone Modus. Wenn Sie jedoch den semisynchronen Modus mit mehr als 1.000 Instanzen verwenden, kann der Instanzabruf die verfügbaren Ressourcen auslagern, was die Leistung des Programms oder Skripts und des Computers mithilfe des Programms oder Skripts beeinträchtigen kann. Jedes Objekt benötigt die erforderlichen Ressourcen, bis der Arbeitsspeicher freigegeben wird.

Um diese Bedingung zu umkehren, können Sie die -Methode mit dem iFlags-Parameter aufrufen, der mit den Flags wbemFlagForwardOnly und wbemFlagReturnImmediately festgelegt wurde, um WMI anweisen, ein vorwärts gerichtetes SWbemObjectSetzurückgibt. Ein vorwärts vorwärts geschaltetes SWbemObjectSet beseitigt das Leistungsproblem, das durch ein großes DataSet verursacht wird, indem der Arbeitsspeicher nach dem Aufzählen des Objekts frei wird.

Jede SWbemServices-Methode, die weder im synchronen noch im asynchronen Modus aufgerufen werden kann, wird im semisynchronen Modus aufgerufen.

Die folgenden Methoden werden im semisynchronen Modus aufgerufen:

Weitere Informationen zum semisynchronen Modus finden Sie unter Ausführen eines semisynchronen Aufrufs mit C++ und Ausführen eines semisynchronen Aufrufs mit VBScript.

Verbessern der Enumerationsleistung

Skripterstellung mit SWbemObject

WbemFlagEnum