Freigeben über


Überwachen von Ereignissen

Systemadministrator*innen können WMI verwenden, um Ereignisse in einem Netzwerk zu überwachen. Beispiel:

  • Ein Dienst wird unerwartet beendet.
  • Ein Server ist nicht mehr verfügbar.
  • Ein Datenträgerlaufwerk wird zu 80 % ausgelastet.
  • Sicherheitsereignisse werden an ein NT-Ereignisprotokoll gesendet.

WMI unterstützt die Ereigniserkennung und -übermittlung an Ereignisconsumer, da einige WMI-Anbieter Ereignisanbieter sind. Weitere Informationen finden Sie unter Empfangen eines WMI-Ereignisses.

Ereignisconsumer sind Anwendungen oder Skripts, die Benachrichtigungen zu Ereignissen anfordern und dann Aufgaben ausführen, wenn bestimmte Ereignisse auftreten. Sie können Ereignisüberwachungsskripts oder -anwendungen erstellen, die beim Auftreten von Ereignissen eine vorübergehende Überwachung ausführen. WMI stellt außerdem verschiedene vorinstallierte permanente Ereignisanbieter und die permanenten Consumerklassen bereit, mit denen Sie Ereignisse dauerhaft überwachen können. Weitere Informationen finden Sie unter Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern.

Dieses Thema umfasst die folgenden Abschnitte:

Verwenden temporärer Ereignisconsumer

Temporäre Ereignisconsumer sind Skripts oder Anwendungen, die die Ereignisse zurückgeben, die mit einer Ereignisabfrage oder einem Filter übereinstimmen. Temporäre Ereignisabfragen verwenden in der Regel IWbemServices::ExecNotificationQuery in C++-Anwendungen bzw. SWbemServices.ExecNotificationQuery in Skripts und Visual Basic.

Eine Ereignisabfrage fordert Instanzen einer Ereignisklasse an, die einen bestimmten Ereignistyp angibt, z. B. Win32_ProcessTrace oder RegistryKeyChangeEvent.

Im folgenden VBScript-Codebeispiel wird eine Benachrichtigung angefordert, wenn eine Instanz von Win32_ProcessTrace erstellt wird. Eine Instanz dieser Klasse wird generiert, wenn ein Prozess gestartet oder beendet wird.

Um das Skript auszuführen, kopieren Sie es in eine Datei namens „event.vbs“, und verwenden Sie die folgende Befehlszeile: cscript event.vbs. Sie können die Ausgabe des Skripts anzeigen, indem Sie „Notepad.exe“ oder einen anderen Prozess starten. Das Skript wird beendet, nachdem fünf Prozesse gestartet oder beendet wurden.

Dieses Skript ruft SWbemServices.ExecNotificationQuery auf, die halbsynchrone Version der Methode. Im nächsten Skript sehen Sie ein Beispiel zum Einrichten eines asynchronen temporären Ereignisabonnements durch Aufrufen von SWbemServices.ExecNotificationQueryAsync. Weitere Informationen finden Sie unter Aufrufen einer WMI-Methode. Das Skript ruft SWbemEventSource.NextEvent auf, um jedes Ereignis beim Eintreffen abzurufen und zu verarbeiten. Speichern Sie das Skript in einer Datei mit der Erweiterung „.vbs“, und führen Sie das Skript in einer Befehlszeile unter Verwendung von CScript aus: cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Temporäre Ereignisconsumer müssen manuell gestartet werden und dürfen nicht über WMI- oder Betriebssystemneustarts hinweg beibehalten werden. Ein temporärer Ereignisconsumer kann Ereignisse nur verarbeiten, während er ausgeführt wird.

Im folgenden Verfahren wird beschrieben, wie Sie einen temporären Ereignisconsumer erstellen.

So erstellen Sie einen temporären Ereignisconsumer

  1. Entscheiden Sie, welche Programmiersprache verwendet werden soll.

    Die Programmiersprache bestimmt die zu verwendende API.

  2. Die ersten Schritte bei der Programmierung einer Anwendung für einen temporären Ereignisconsumer sind die gleichen wie bei einer WMI-Anwendung.

    Die ersten Schritte bei der Programmierung hängen von der Programmiersprache ab. In der Regel melden Sie sich bei WMI an und richten die Sicherheitseinstellungen ein. Weitere Informationen finden Sie unter Erstellen einer WMI-Anwendung oder eines WMI-Skripts.

  3. Definieren Sie die Ereignisabfrage, die Sie verwenden möchten.

    Zum Abrufen einiger Leistungsdatentypen müssen Sie möglicherweise Klassen verwenden, die von Hochleistungsanbietern bereitgestellt werden. Weitere Informationen finden Sie unter Überwachen von Leistungsdaten, Bestimmen des Typs des zu empfangenden Ereignisses und Abfragen mit WQL.

  4. Entscheiden Sie sich für einen asynchronen oder einen halbsynchronen Aufruf, und wählen Sie die API-Methode aus.

    Mit asynchronen Aufrufen können Sie den Mehraufwand für den Abruf von Daten vermeiden. Halbsynchrone Aufrufe bieten jedoch eine ähnliche Leistung bei höherer Sicherheit. Weitere Informationen finden Sie unter Aufrufen einer WMI-Methode.

  5. Rufen Sie die asynchrone oder halbsynchrone Methode auf, und schließen Sie eine Ereignisabfrage als strQuery-Parameter ein.

    Rufen Sie für C++-Anwendungen die folgenden Methoden auf:

    Rufen Sie für Skripts die folgenden Methoden auf:

  6. Schreiben Sie den Code, um das zurückgegebene Ereignisobjekt zu verarbeiten.

    Fügen Sie bei asynchronen Ereignisabfragen den Code in die verschiedenen Methoden oder Ereignisse der Objektsenke ein. Bei halbsynchronen Ereignisabfragen wird jedes Objekt zurückgegeben, wenn es von WMI abgerufen wird. Daher sollte sich der Code in der Schleife enthalten, die die einzelnen Objekte verarbeitet.

Das folgende Skriptcodebeispiel ist eine asynchrone Version des Skripts Win32_ProcessTrace. Da asynchrone Vorgänge sofort zurückgegeben werden, bleibt das Skript in einem Dialogfeld aktiv, während es auf Ereignisse wartet.

Anstatt SWbemEventSource.NextEvent aufzurufen, um die einzelnen Ereignisse zu empfangen, verfügt das Skript über einen Ereignishandler für das Ereignis SWbemSink OnObjectReady.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Hinweis

Ein asynchroner Rückruf (etwa ein Rückruf, der von der Unterroutine SINK_OnObjectReady behandelt wird) ermöglicht es nicht authentifizierten Benutzer*innen, Daten für die Senke bereitzustellen. Um die Sicherheit zu erhöhen, verwenden Sie entweder halbsynchrone Kommunikation oder synchrone Kommunikation. Weitere Informationen finden Sie in den folgenden Themen:

 

Verwenden permanenter Ereignisconsumer

Ein permanenter Ereignisconsumer wird ausgeführt, bis seine Registrierung explizit abgebrochen wird, und startet dann, wenn WMI oder das System neu gestartet wird.

Ein permanenter Ereignisconsumer ist eine Kombination aus WMI-Klassen, Filtern und COM-Objekten in einem System.

In der folgenden Liste werden die Teile angegeben, die zum Erstellen eines permanenten Ereignisconsumers erforderlich sind:

  • Ein COM-Objekt, das den Code enthält, der den permanenten Consumer implementiert
  • Eine neue permanente Consumerklasse
  • Eine Instanz der permanenten Consumerklasse
  • Ein Filter, der die Abfrage für Ereignisse enthält
  • Eine Verknüpfung zwischen dem Consumer und dem Filter

Weitere Informationen finden Sie unter Empfangen von Ereignissen zu jeder Zeit.

WMI liefert mehrere permanente Consumer. Die Consumerklassen und das COM-Objekt, das den Code enthält, sind vorinstalliert. Sie können beispielsweise eine Instanz der ActiveScriptEventConsumer-Klasse erstellen und konfigurieren, um ein Skript auszuführen, wenn ein Ereignis auftritt. Weitere Informationen finden Sie unter Überwachen von Ereignissen und Reagieren auf Ereignisse mit Standardconsumern. Ein Beispiel für die Verwendung von ActiveScriptEventConsumer finden Sie unter Ausführen eines Skripts basierend auf einem Ereignis.

Im folgenden Verfahren wird beschrieben, wie Sie eine Klasse für einen permanenten Ereignisconsumer erstellen.

So erstellen Sie einen permanenten Ereignisconsumer

  1. Registrieren Sie den Ereignisanbieter bei dem von Ihnen verwendeten Namespace.

    Einige Ereignisanbieter können nur einen bestimmten Namespace verwenden. Beispielsweise ist __InstanceCreationEvent ein systeminternes Ereignis, das vom Win32-Anbieter unterstützt wird und standardmäßig beim Namespace „\root\cimv2“ registriert ist.

    Hinweis

    Sie können die Eigenschaft EventNamespace der in der Registrierung verwendeten Klasse __EventFilter verwenden, um ein namespaceübergreifendes Abonnement zu erstellen. Weitere Informationen finden Sie unter Implementieren namespaceübergreifender permanenter Ereignisabonnements.

     

  2. Registrieren Sie den Ereignisconsumeranbieter bei dem Namespace, in dem sich Ereignisklassen befinden.

    WMI verwendet einen Ereignisconsumeranbieter, um einen Ereignisconsumer zu finden, der dauerhaft ist. Der permanente Ereignisconsumer ist die Anwendung, die WMI startet, wenn ein Ereignis empfangen wird. Um Ereignisconsumer zu registrieren, erstellen Anbieter Instanzen von __EventConsumerProviderRegistration.

  3. Erstellen Sie eine Instanz der Klasse, die den permanenten Ereignisconsumer darstellt, den Sie verwenden möchten.

    Ereignisconsumerklassen werden von der Klasse __EventConsumer abgeleitet. Legen Sie die Eigenschaften fest, die die Ereignisconsumerinstanz benötigt.

  4. Registrieren Sie den Consumer mithilfe des Hilfsprogramms regsvr32 bei COM.

  5. Erstellen Sie eine Instanz der Ereignisfilterklasse __EventFilter.

    Legen Sie die erforderlichen Felder für die Ereignisfilterinstanz fest. Die erforderlichen Felder für __EventFilter sind Name, QueryLanguage und Query. Die Name-Eigenschaft kann ein beliebiger eindeutiger Name für eine Instanz dieser Klasse sein. Die QueryLanguage-Eigenschaft ist immer auf „WQL“ festgelegt. Die Query-Eigenschaft ist eine Zeichenfolge, die eine Ereignisabfrage enthält. Ein Ereignis wird generiert, wenn bei der Abfrage eines permanenten Ereignisconsumers ein Fehler auftritt. Die Quelle des Ereignisses ist WinMgmt, die Ereignis-ID ist 10, und der Ereignistyp ist „Error“.

  6. Erstellen Sie eine Instanz der Klasse __FilterToConsumerBinding, um einen logischen Ereignisconsumer einem Ereignisfilter zuzuordnen.

    WMI verwendet eine Zuordnung, um den Ereignisconsumer zu ermitteln, der dem Ereignis zugeordnet ist, das den im Ereignisfilter angegebenen Kriterien entspricht. WMI verwendet den Ereignisconsumeranbieter, um die zu startende Anwendung für den permanenten Ereignisconsumer zu ermitteln.