Empfangen von synchronen und semisynchronen Ereignisbenachrichtigungen
Verwenden Sie SWbemServices.ExecQuery, um alle vorhandenen Ereignisse anzufordern.
Das folgende Codebeispiel zeigt, wie Die Ereignisse in einem Protokoll abgefragt werden.
Select * from Win32_NTLogEvent
Weitere Informationen finden Sie unter Bestimmen des Typs des zu empfangenden Ereignisses,Empfangen von Ereignisbenachrichtigungenund WQL (SQL für WMI).
Der Standardaufruf von SWbemServices.ExecNotificationQuery verwendet semisynchrone Kommunikation. Für den iflags-Parameter sind die Flags wbemFlagForwardOnly und wbemFlagReturnImmediately standardmäßig festgelegt. Weitere Informationen finden Sie unter Aufrufen einer Methode.
Im folgenden Verfahren wird beschrieben, wie Sie mithilfe von VBScript semisynchrone Ereignisbenachrichtigungen empfangen.
So empfangen Sie semisynchrone Ereignisbenachrichtigungen in VBScript
Erstellen Sie eine Abfrage für den Ereignistyp, den Sie empfangen möchten. Weitere Informationen finden Sie unter Bestimmen des Typs des zu empfangenden Ereignisses.
Wenn Sie einen Instanztyp von Ereignis wie _ _ InstanceCreationEventanfordern, geben Sie in der Abfrage einen Typ der Zielinstanz an, z. B. Win32 _ LogicalDisk.
Geben Sie bei Bedarf eine -Instanz an, z. B. den Namen eines Namespace, wenn Sie zukünftige _ _ NamespaceModificationEvent-Instanzen für einen bestimmten Namespace anfordern.
Geben Sie ein Abrufintervall für Windows Management Instrumentation (WMI) in einer Abfrage an, z. B. "WITHIN 10", um alle 10 Sekunden abzufragen. Weitere Informationen finden Sie unter WITHIN-Klausel.
Rufen Sie SWbemServices.ExecNotificationQuery mithilfe der Abfrage auf.
Durchlaufen Sie die sammlung, die Sie erhalten.
Das folgende Beispiel zeigt, wie Sie das Einfügen und Entfernen von Datenträgern von einem Diskettenlaufwerk auf einem lokalen Computer überwachen. Das Skript fordert _ _ _ InstanceModificationEvent-Instanzen für die Win32 _ LogicalDisk-Instanz des Diskettenlaufwerks an und fragt alle 10 Sekunden nach neuen Instanzen ab. Dieses Skript ist ein Beispiel für einen temporären Ereignisverbraucher und wird weiter ausgeführt, bis es in Task-Manager beendet oder das System neu gestartet wird. Weitere Informationen finden Sie unter Empfangen von Ereignissen für die Dauer Ihrer Anwendung.
Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
("Select * from __InstanceModificationEvent within 10 WHERE " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
Set strDiskChange = colMonitoredDisks.NextEvent
If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
If strDiskChange.TargetInstance.Size > 0 Then
Wscript.Echo "A disk has been inserted" & _
" into the floppy drive."
Else
Wscript.Echo "A disk has been removed" & _
" from the floppy drive."
End If
End If
Loop
Im folgenden Verfahren wird beschrieben, wie Sie mit C++ semisynchrone Ereignisbenachrichtigungen empfangen.
So empfangen Sie semisynchrone Ereignisbenachrichtigungen in C++
Richten Sie die Anwendung mit Aufrufen der Funktionen CoInitializeEx und CoInitializeSecurity ein.
Da WMI AUF COM basiert, ist der Aufruf von CoInitializeEx und CoInitializeSecurity ein erforderlicher Schritt für eine WMI-Anwendung. Weitere Informationen finden Sie unter Erstellen einer WMI-Anwendung oder eines Skripts.
Bestimmen Sie die Art der Ereignisse, die Sie empfangen möchten.
WMI unterstützt systeminterne und extrinsische Ereignisse. Ein systeminternes Ereignis ist ein von WMI vordefiniertes Ereignis. Ein extrinsisches Ereignis ist ein Ereignis, das von einem Drittanbieter definiert wird. Weitere Informationen finden Sie unter Bestimmen des Typs des zu empfangenden Ereignisses.
Registrieren Sie sich, um eine bestimmte Klasse von Ereignissen mit einem Aufruf der IWbemServices::ExecNotificationQuery-Methode zu empfangen.
Machen Sie jede Abfrage sehr spezifisch. Das Ziel der Registrierung ist die Registrierung, um nur die erforderlichen Benachrichtigungen zu erhalten. Benachrichtigungen, die keine Verarbeitungs- und Übermittlungszeit für Verschwendung erfordern.
Sie können einen Ereignisverbraucher so entwerfen, dass er mehrere Ereignisse empfängt. Beispielsweise kann ein Consumer eine Benachrichtigung über Instanzänderungsereignisse für eine bestimmte Klasse von Geräte- und Sicherheitsverletzungsereignissen erfordern. In diesem Fall unterscheiden sich die Aufgaben, die ein Consumer beim Empfangen eines Instanzänderungsereignisses ausführt, für die beiden Ereignisse. Daher sollte der Consumer einen Aufruf von IWbemServices::ExecNotificationQuery durchführen, um sich für Instanzänderungsereignisse zu registrieren, und einen anderen Aufruf von ExecNotificationQuery, um sich für Sicherheitsverletzungsereignisse zu registrieren.
Legen Sie im Aufruf von ExecNotificationQueryden lFlags-Parameter auf WBEM _ FLAG RETURN _ _ IMMEDIATELY und WBEM _ FLAG FORWARD _ _ ONLY fest. Das Flag WBEM _ FLAG RETURN _ _ IMMEDIATELY fordert eine semisynchrone Verarbeitung an, und das Flag WBEM _ FLAG FORWARD _ _ ONLY fordert einen vorwärts gerichteten Enumerator an. Weitere Informationen finden Sie unter Aufrufen einer Methode. Die ExecNotificationQuery-Funktion gibt einen Zeiger auf eine IEnumWbemClassObject-Schnittstelle zurück.
Rufen Sie registrierte Ereignisbenachrichtigungen ab, indem Sie wiederholte Aufrufe an die IEnumWbemClassObject::Next-Methode senden.
Geben Sie abschließend den Enumerator frei, der auf das IEnumWbemClassObject-Objekt verweist.
Sie können den IWbemServices-Zeiger freigeben, der der Registrierung zugeordnet ist. Das Freigeben des IWbemServices-Zeigers bewirkt, dass WMI die Übermittlung von Ereignissen an alle zugeordneten temporären Consumer beendet.