Empfangen von synchronen und semisynchronen Ereignisbenachrichtigungen

Verwenden Sie SWbemServices.ExecQuery, um alle vorhandenen Ereignisse anzufordern.

Im folgenden Codebeispiel wird gezeigt, wie Sie die Ereignisse in einem Protokoll abfragen.

Select * from Win32_NTLogEvent

Weitere Informationen finden Sie unter Bestimmen des zu empfangenden Ereignistyps, Empfangen von Ereignisbenachrichtigungen und WQL (SQL für WMI).

Der Standardaufruf von SWbemServices.ExecNotificationQuery verwendet semisynchrone Kommunikation. Für den iflags-Parameter sind standardmäßig die Flags wbemFlagForwardOnly und wbemFlagReturnImmediately festgelegt. Weitere Informationen finden Sie unter Aufrufen einer Methode.

Im folgenden Verfahren wird beschrieben, wie Sie mithilfe von VBScript eine semisynchrone Ereignisbenachrichtigung empfangen.

Empfangen semisynchroner Ereignisbenachrichtigungen in VBScript

  1. Erstellen Sie eine Abfrage für den Ereignistyp, den Sie empfangen möchten. Weitere Informationen finden Sie unter Bestimmen des zu empfangenden Ereignistyps.

  2. Wenn Sie einen instanzbasierten Ereignistyp anfordern, z. B. __InstanceCreationEvent, geben Sie in der Abfrage einen Zielinstanztyp an, z. B. Win32_LogicalDisk.

  3. Geben Sie bei Bedarf eine Instanz an, z. B. den Namen eines Namespace, wenn zukünftige __NamespaceModificationEvent-Instanzen für einen bestimmten Namespace angefordert werden.

  4. Legen Sie ein Abrufintervall für Windows-Verwaltungsinstrumentation (WMI) in einer Abfrage fest, z. B."WITHIN 10", wenn der Abruf alle 10 Sekunden erfolgen soll. Weitere Informationen finden Sie unter WITHIN-Klausel.

  5. Rufen Sie SWbemServices.ExecNotificationQuery mithilfe der Abfrage auf.

  6. Durchlaufen Sie die empfangene Auflistung.

Das folgende Beispiel zeigt, wie das Einfügen und Entfernen von Datenträgern aus einem Diskettenlaufwerk auf einem lokalen Computer überwacht wird. Das Skript fordert ___InstanceModificationEvent-Instanzen für die Diskettenlaufwerk-Instanz Win32_LogicalDisk an und führt alle 10 Sekunden Abfragen nach neuen Instanzen aus. Dieses Skript ist ein Beispiel für einen temporären Ereignisconsumer. Es wird so lange ausgeführt, bis es im Task-Manager beendet oder das System neu gestartet wird. Weitere Informationen finden Sie unter Empfangen von Ereignissen über die Dauer der Anwendung hinweg.

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 mithilfe von C++ eine semisynchrone Ereignisbenachrichtigung empfangen.

Empfangen semisynchroner Ereignisbenachrichtigungen in C++

  1. Richten Sie die Anwendung mit Aufrufen der Funktionen CoInitializeEx und CoInitializeSecurity ein.

    Da WMI COM-basiert arbeitet, ist der Aufruf von CoInitializeEx und CoInitializeSecurity ein Schritt, der im Rahmen von WMI-Anwendungen erforderlich ist. Weitere Informationen finden Sie unter Erstellen einer WMI-Anwendung oder eines WMI-Skripts.

  2. 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 zu empfangenden Ereignistyps.

  3. Registrieren Sie sich, um eine bestimmte Klasse von Ereignissen mit einem Aufruf der Methode IWbemServices::ExecNotificationQuery zu empfangen.

    Legen Sie jede Abfrage möglichst genau fest. Ziel der Registrierung ist es, sich nur für die gewünschten Benachrichtigungen zu registrieren. Nicht benötigte Benachrichtigungen nehmen unnötig Zeit für die Verarbeitung und Zustellung in Anspruch.

    Sie können einen Ereignisconsumer so entwerfen, dass er mehrere Ereignisse empfangen kann. Beispielsweise kann ein Consumer eine Benachrichtigung über Instanzänderungsereignisse für bestimmte Geräteklassen und Sicherheitsverstöße erfordern. In diesem Fall unterscheiden sich die von einem Consumer ausgeführten Aufgaben für die beiden Ereignisse, wenn er ein Instanzänderungsereignis empfängt. Daher sollte der Consumer IWbemServices::ExecNotificationQuery aufrufen, um sich für Instanzänderungsereignisse zu registrieren, und einen weiteren Aufruf von ExecNotificationQuery ausführen, um sich für Sicherheitsverstöße zu registrieren.

    Legen Sie im Aufruf von ExecNotificationQuery den Parameter lFlags auf WBEM_FLAG_RETURN_IMMEDIATELY und WBEM_FLAG_FORWARD_ONLY fest. Das WBEM_FLAG_RETURN_IMMEDIATELY-Flag fordert eine semisynchrone Verarbeitung an, und das WBEM_FLAG_FORWARD_ONLY-Flag fordert einen forward-only-Enumerator an. Weitere Informationen finden Sie unter Aufrufen einer Methode. Die Funktion ExecNotificationQuery gibt einen Zeiger auf eine IEnumWbemClassObject-Schnittstelle zurück.

  4. Suchen Sie nach registrierten Ereignisbenachrichtigungen durch wiederholte Aufrufe der Methode IEnumWbemClassObject::Next.

  5. Wenn Sie fertig sind, geben Sie den Enumerator frei, der auf das Objekt IEnumWbemClassObject verweist.

    Sie können den IWbemServices-Zeiger freigeben, der der Registrierung zugeordnet ist. Das Freigeben des IWbemServices-Zeigers bewirkt, dass WMI keine Ereignisse mehr an alle zugeordneten temporären Consumer liefert.