SWbemSink-Objekt
Das SWbemSink-Objekt wird von Clientanwendungen implementiert, um die Ergebnisse asynchroner Vorgänge und Ereignisbenachrichtigungen zu empfangen. Um einen asynchronen Aufruf auszuführen, müssen Sie eine Instanz eines SWbemSink-Objekts erstellen und als ObjWbemSink-Parameter übergeben. Die Ereignisse in Ihrer Implementierung von SWbemSink werden ausgelöst, wenn Status oder Ergebnisse zurückgegeben werden oder wenn der Aufruf abgeschlossen ist. Dieses Objekt wird durch den VBScript-Aufruf CreateObject erstellt.
Member
Das SWbemSink-Objekt weist die folgenden Typen von Membern auf:
Methoden
Das SWbemSink-Objekt verfügt über die folgenden Methoden.
Methode | BESCHREIBUNG |
---|---|
Abbrechen | Bricht alle asynchronen Vorgänge ab, die dieser Senke zugeordnet sind. |
Bemerkungen
Ein asynchroner Rückruf ermöglicht es nicht authentifizierten Benutzer*innen, Daten für die Senke bereitzustellen. Dies stellt Sicherheitsrisiken für Ihre Skripts und Anwendungen dar. Um die Risiken zu vermeiden, verwenden Sie entweder semisynchrone Kommunikation oder synchrone Kommunikation. Weitere Informationen finden Sie unter Aufrufen einer Methode.
Ereignisse
Sie können Unterroutinen implementieren, die beim Auslösen von Ereignissen aufgerufen werden sollen. Wenn Sie beispielsweise jedes Objekt verarbeiten möchten, das von einem asynchronen Abfrageaufruf wie SWbemServices.ExecQueryAsync zurückgegeben wird, erstellen Sie eine Unterroutine mit der Senke, die im asynchronen Aufruf angegeben ist, wie im folgenden Beispiel gezeigt.
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
Verwenden Sie die folgende Tabelle als Referenz, um Ereignisse und Triggerbeschreibungen zu identifizieren.
Ereignis | BESCHREIBUNG |
---|---|
OnCompleted | Wird ausgelöst, wenn ein asynchroner Vorgang abgeschlossen ist. |
OnObjectPut | Wird ausgelöst, wenn ein asynchroner Put-Vorgang abgeschlossen ist. |
OnObjectReady | Wird ausgelöst, wenn ein von einem asynchronen Aufruf bereitgestelltes Objekt verfügbar ist. |
OnProgress | Wird ausgelöst, um den Status eines asynchronen Vorgangs bereitzustellen. |
Asynchrones Abrufen von Ereignisprotokollstatistiken
WMI unterstützt sowohl asynchrone als auch semisynchrone Skripts. Beim Abrufen von Ereignissen aus den Ereignisprotokollen rufen asynchrone Skripts diese Daten häufig viel schneller ab.
In einem asynchronen Skript wird eine Abfrage ausgegeben und die Steuerung sofort an das Skript zurückgegeben. Die Verarbeitung der Abfrage wird in einem separaten Thread fortgesetzt, während das Skript sofort auf die zurückgegebenen Informationen reagiert. Asynchrone Skripts sind ereignisgesteuert: Jedes Mal, wenn ein Ereignisdatensatz abgerufen wird, wird das OnObjectReady-Ereignis ausgelöst. Wenn die Abfrage abgeschlossen ist, wird das OnCompleted-Ereignis ausgelöst, und das Skript kann basierend auf der Tatsache fortgesetzt werden, dass alle verfügbaren Datensätze zurückgegeben wurden.
In einem semisynchronen Skript wird dagegen eine Abfrage ausgegeben, und das Skript stellt dann eine große Menge abgerufener Informationen in die Warteschlange, bevor es darauf reagiert. Für viele Objekte ist die semisynchrone Verarbeitung ausreichend. Wenn Sie beispielsweise ein Datenträgerlaufwerk nach seinen Eigenschaften abfragen, liegt möglicherweise nur ein Sekundenbruchteil zwischen dem Zeitpunkt, zu dem die Abfrage ausgegeben wird, und dem Zeitpunkt, zu dem die Informationen zurückgegeben werden und eine Reaktion darauf erfolgt. Dies ist größtenteils darauf zurückzuführen, dass die Menge der zurückgegebenen Informationen relativ gering ist.
Beim Abfragen eines Ereignisprotokolls kann die Zeitspanne zwischen dem Ausgeben der Abfrage und dem Zeitpunkt, zu dem ein semisynchrones Skript die Rückgabe und das Reagieren auf die Informationen beenden kann, jedoch Stunden dauern. Darüber hinaus kann es sein, dass dem Skript nicht genügend Arbeitsspeicher zur Verfügung steht und ein Fehler auftritt, bevor der Vorgang abgeschlossen ist.
Bei Ereignisprotokollen mit einer großen Anzahl von Datensätzen kann der Unterschied in der Verarbeitungszeit beträchtlich sein. Auf einem Windows 2000-basierten Testcomputer mit 2.000 Datensätzen im Ereignisprotokoll dauerte eine semisynchrone Abfrage, bei der alle Ereignisse abgerufen und in einem Befehlsfenster angezeigt wurden, 10 Minuten und 45 Sekunden. Eine asynchrone Abfrage zur Ausführung desselben Vorgangs dauerte 1 Minute und 54 Sekunden.
Beispiele
Das folgende VBScript fragt die Ereignisprotokolle asynchron nach allen Datensätzen ab.
Const POPUP_DURATION = 10
Const OK_BUTTON = 0
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.InstancesOfAsync objSink, "Win32_NTLogEvent"
errReturn = objWshShell.Popup("Retrieving events", POPUP_DURATION, _
"Event Retrieval", OK_BUTTON)
Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
WScript.Echo "Asynchronous operation is done."
End Sub
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
Wscript.Echo "Category: " & objEvent.Category
Wscript.Echo "Computer Name: " & objEvent.ComputerName
Wscript.Echo "Event Code: " & objEvent.EventCode
Wscript.Echo "Message: " & objEvent.Message
Wscript.Echo "Record Number: " & objEvent.RecordNumber
Wscript.Echo "Source Name: " & objEvent.SourceName
Wscript.Echo "Time Written: " & objEvent.TimeWritten
Wscript.Echo "Event Type: " & objEvent.Type
Wscript.Echo "User: " & objEvent.User
End Sub
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista |
Unterstützte Mindestversion (Server) |
Windows Server 2008 |
Header |
|
IDL |
|
DLL |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |