Aufrufen einer WMI-Methode

WMI stellt in der COM-API und in der Skript-API Methoden bereit, um Informationen abzurufen oder Objekte in einem Unternehmenssystem zu bearbeiten. Beispielsweise werden mit der WMI-Skriptmethode SWbemServices.ExecQuery Daten abgefragt. Anbieter verfügen außerdem über Methoden, die in den von ihnen registrierten Klassen definiert sind. Beispiele sind die Methoden Win32_LogicalDiskChkdsk und ScheduleAutoChk, die vom Win32-Anbieter bereitgestellt werden.

Dieses Thema umfasst die folgenden Abschnitte:

WMI- und Anbietermethoden im Vergleich

Durch die Verwendung von WMI-Methodenaufrufen in Kombination mit Anbietermethoden können Sie Informationen über Ihr 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 auf jede WMI-Datenklasse angewendet werden können. Weitere Informationen finden Sie unter Skripterstellung mit SWbemObject.

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

Die folgenden WMI- und Anbietermethoden sind in der Skript-API für WMI enthalten:

Sie können im Abschnitt der Rückgabecodes für Win32_Service nach dem Code suchen, der möglicherweise im Abschnitt „Return“ angezeigt wird.

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()
}

Methodenaufrufmodi in WMI

Der halbsynchrone Aufrufmodus bietet üblicherweise das beste Gleichgewicht zwischen Sicherheit und Leistung.

Weitere Informationen zu jedem der möglichen Modi finden Sie in den folgenden Abschnitten:

Synchroner Modus

Der synchrone Modus liegt vor, wenn das Programm oder Skript pausiert, bis der Methodenaufruf ein Objekt der SWbemObjectSet-Auflistung zurückgibt. WMI erstellt diese Auflistung im Arbeitsspeicher, bevor das Auflistungsobjekt an das aufrufende Programm oder Skript zurückgegeben wird.

Der synchrone Modus kann sich negativ auf die Programm- oder Skriptleistung des Computers 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 Speicherplatz beanspruchen, da WMI aus jedem Ereignis ein Objekt erstellt und diese Objekte dann in einer Auflistung zusammenfasst, bevor die Auflistung an die Methode übergeben wird.

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

Alle SWbemServices-Methoden ohne das Wort „Async“ im Namen können im synchronen Modus aufgerufen werden, indem Sie für den iFlags-Parameter den Wert wbemFlagReturnWhenComplete festlegen.

Asynchroner Modus

Der asynchrone Modus liegt vor, wenn das Programm oder Skript nach dem Aufruf der Methode weiter ausgeführt wird. WMI gibt beim Erstellen der einzelnen Objekte alle Objekte aus der Methode an ein SWbemSink-Objekt zurück. Das aufrufende Programm oder Skript muss über ein SWbemSink-Objekt und einen SWbemSink.OnObjectReady-Ereignishandler zur Verarbeitung der zurückgegebenen Objekte verfügen. Weitere Informationen zum Erstellen eines Ereignishandlers für den asynchronen Modus finden Sie unter Empfangen eines WMI-Ereignisses.

Dieser Modus unterliegt zwar nicht den Leistungs- und Ressourceneinschränkungen des synchronen Modus, aber der asynchrone Modus kann ernsthafte Sicherheitsrisiken mit sich bringen, da die im SWbemSink-Objekt gespeicherten Ergebnisse möglicherweise nicht vom aufrufenden Programm oder Skript stammen. WMI senkt die Authentifizierungsebene für das SWbemSink-Objekt, bis die Methode erfolgreich ist. Weitere Informationen zum Minimieren dieser Sicherheitsrisiken finden Sie unter Festlegen der Sicherheit für einen asynchronen Aufruf.

Methoden mit dem Suffix „Async“ sind Methoden für den asynchronen Modus. Die folgenden Methoden führen asynchrone Aufrufe aus:

Weitere Informationen zu asynchronen Anrufen finden Sie in diesen Abschnitten:

Halbsynchroner Modus

Der halbsynchrone Modus ähnelt dem asynchronen Modus dahingehend, dass das Programm oder Skript nach dem Aufruf der Methode weiter ausgeführt wird. Im halbsynchronen Modus ruft WMI die Objekte im Hintergrund ab, während Ihr Skript oder Programm weiter ausgeführt wird. WMI gibt jedes Objekt direkt nach seiner Erstellung an die aufrufende Methode zurück.

Da WMI das Objekt verwaltet, ist der halbsynchrone Modus sicherer als der asynchrone Modus. Wenn Sie den halbsynchronen Modus jedoch mit mehr als 1.000 Instanzen verwenden, kann der Instanzenabruf die verfügbaren Ressourcen monopolisieren, was wiederum die Leistung des Programms oder Skripts und des Computers beeinträchtigen kann, der das Programm oder Skript verwendet. Jedes Objekt nimmt die erforderlichen Ressourcen in Anspruch, bis der Speicher freigegeben wird.

Um diese Bedingung zu umgehen, können Sie die Methode mit dem iFlags-Parameter mit festgelegten Flags wbemFlagForwardOnly und wbemFlagReturnImmediately aufrufen, um WMI anzuweisen, ein rein vorwärtsgerichtetes SWbemObjectSet-Objekt zurückzugeben. Ein vorwärtsgerichtetes SWbemObjectSet-Objekt beseitigt das durch ein großes Dataset verursachte Leistungsproblem, indem der Speicher nach der Aufzählung des Objekts freigegeben wird.

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

Die folgenden Methoden werden im halbsynchronen Modus aufgerufen:

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

Verbessern der Enumerationsleistung

Skripterstellung mit SWbemObject

WbemFlagEnum