Empfangen von Ereignissen zu jeder Zeit

Möglicherweise möchten Sie eine Anwendung schreiben, die jederzeit auf Ereignisse reagieren kann. Beispielsweise kann ein Administrator eine E-Mail-Nachricht erhalten, wenn bestimmte Leistungskennzahlen auf Netzwerkservern abgenommen haben. In diesem Fall sollte Ihre Anwendung jederzeit ausgeführt werden. Das kontinuierliche Ausführen einer Anwendung ist jedoch keine effiziente Nutzung von Systemressourcen. Stattdessen können Sie mit WMI einen permanenten Ereignisconsumer erstellen. Permanente Ereignisconsumer müssen besondere Sicherheitsanforderungen erfüllen. Weitere Informationen finden Sie unter Schützen von WMI-Ereignissen.

Ein permanenter Ereignisconsumer empfängt Ereignisse, bis seine Registrierung explizit abgebrochen wird.

Ein permanenter Ereignisconsumer ist eine Kombination aus den folgenden WMI-Klassen, Filtern und COM-Objekten, die sich in Ihrem System befinden:

  • Ein COM-Objekt, das als physischer Consumer bezeichnet wird. WMI liefert mehrere permanente Standardconsumer. Beispielsweise führt der Active Script Event-Consumer ein Skript aus, wenn ein Ereignis auftritt.
  • Eine neue permanente Consumerklasse.
  • Ein Instanz der permanenten Consumerklasse, die als logischer Consumer bezeichnet wird.
  • Ein Filter, der die Abfrage für Ereignisse enthält.
  • Eine Verknüpfung zwischen dem Consumer und dem Filter.

Die Eigenschaften eines logischen Ereignisconsumers geben die Aktionen an, die ausgeführt werden sollen, wenn sie über ein Ereignis benachrichtigt werden, definieren jedoch nicht die Ereignisabfragen, denen sie zugeordnet sind. Bei Signalisierung lädt WMI automatisch das COM-Objekt, das den permanenten Ereignisconsumer darstellt, in den aktiven Speicher. In der Regel tritt dies beim Start oder als Reaktion auf ein auslösendes Ereignis auf. Nach der Aktivierung fungiert der permanente Ereignisconsumer als normaler Ereignisconsumer, bleibt aber so lange erhalten, bis er vom Betriebssystem explizit entladen wird.

Sie können einen eigenen permanenten Ereignisconsumer schreiben oder die vorinstallierten WMI-Standardconsumer-Klassen wie ActiveScriptEventConsumer verwenden. Weitere Informationen finden Sie unter Standardconsumerklassen, Überwachen von und Reagieren auf Ereignisse mit Standardconsumern und Überwachen von Ereignissen.

Im folgenden Verfahren wird beschrieben, wie Sie einen eigenen permanenten Ereignisconsumer erstellen.

So erstellen Sie einen eigenen permanenten Ereignisconsumer

  1. Legen Sie fest, welche Art von Ereignissen Sie empfangen möchten.

    WMI unterstützt systeminterne und extrinsische Ereignisse. Ein systeminternes Ereignis ist ein von WMI vordefiniertes Ereignis, während es sich bei einem extrinsischen Ereignis um ein von einem Drittanbieter definiertes Ereignis handelt. Weitere Informationen finden Sie unter Bestimmen des Typs des zu empfangenden Ereignisses.

  2. Implementieren Sie einen physischen Consumers.

    Der wesentliche Unterschied zwischen einer Verwaltungsanwendung und einem physischen Consumer besteht darin, dass ein Benutzer eine Verwaltungsanwendung lädt und entlädt, während WMI einen physischen Consumer lädt und entlädt. Der Großteil Ihrer Codierung sollte sich im physischen Consumer finden.

    Hinweis

    Dieser Schritt ist der erste Schritt im Verfahren zur Vereinfachung. In Bezug auf die Codierung sollten Sie eigentlich den physischen Consumer zuletzt erstellen. Auf diese Weise können Sie Ihre Parameter und Logik für Ihren permanenten Ereignisanbieter festlegen, bevor Sie mit der langwierigen Codierung beginnen. Es gibt jedoch keine Einschränkung, den physischen Consumer zuerst zu schreiben.

     

  3. Erstellen Sie eine neue Consumerklasse, die den physischen Consumer beschreibt.

    Wie jede Klasse beschreibt die Consumerklasse die allgemeinen Parameter eines permanenten Ereignisconsumers für WMI.

  4. Erstellen Sie eine Instanz der Consumerklasse.

    Wie jede andere WMI-Klasse müssen Sie eine Instanz der Consumerklasse erstellen, wenn Sie die Klasse implementieren möchten. Ein Instanz einer Consumerklasse wird auch als logischer Consumer bezeichnet. Der logische Consumer stellt den physischen Consumer für WMI dar.

  5. Erstellen Sie einen Ereignisfilter.

    Die Ereignisabfragen, die permanente Ereignisconsumer aktivieren, werden als Ereignisfilter bezeichnet. Ein einzelner Ereignisfilter kann mehreren logischen Ereignisconsumern zugeordnet werden. Darüber hinaus können mehrere Ereignisfilter einem einzelnen logischen Ereignisconsumer zugeordnet werden. Der Filter ist eine Instanz von __EventFilter.

    Ein NT-Protokollereignis wird generiert, wenn die Abfrage eines permanenten Ereignisconsumers fehlschlägt. Die Quelle des Ereignisses ist WinMgmt, die Ereignis-ID ist 10, und der Ereignistyp ist Error.

  6. Verknüpfen Sie den Ereignisfilter mit dem logischen Consumer.

    Indem Sie den Ereignisfilter mit dem logischen Consumer verknüpfen, weisen Sie WMI an, welcher Ereignisfilter zu welchem logischen Consumer gehört. Logische Ereignisconsumer und Ereignisfilter werden durch eine Zuordnungsklasse Instanz von __FilterToConsumerBinding verknüpft. Wenn ein Ereignis empfangen wird, das einer in einem Ereignisfilter beschriebenen Ereignisabfrage entspricht, findet WMI den zugeordneten logischen Ereignisconsumer, indem die Zuordnungsklasse Instanz. Nachdem die Instanz des logischen Ereignisconsumers gefunden wurde, verwendet WMI eine Instanz der Klasse __EventConsumerProviderRegistration, um den dieser Instanz zugeordneten physischen Ereignisconsumer zu suchen und auszuführen.

  7. Schreiben eines Ereignisconsumeranbieters.

    Der Ereignisconsumeranbieter ist ein COM-Objekt, das den physischen Consumer für WMI sucht.