Erstellen eines Ereignisfilters

Ein Ereignisfilter ist eine WMI-Klasse, die beschreibt, welche Ereignisse WMI an einen physischen Consumer übermittelt. Beispielsweise kann ein Ereignisfilter WMI anweisen, einem Consumer alle Energieverwaltungsereignisse oder alle Systemneustartereignisse zu übermitteln. Ein Ereignisfilter beschreibt auch die Bedingungen, unter denen WMI die Ereignisse übermittelt. Ein Ereignisfilter kann ein systeminternes oder extrinsisches Ereignis angeben. und der Filter kann auf Ereignisse verweisen, die aus dem Namespace stammen, d. h. auf den Namespace des Filters. Der permanente Consumer muss dieselbe CreatorSID in den Consumer-, Filter- und Bindungsinstanzen aufweisen. Weitere Informationen finden Sie unter Sicherer Empfang von Ereignissen.

Im folgenden Verfahren wird das Erstellen eines Ereignisfilters beschrieben.

So erstellen Sie einen Ereignisfilter

  1. Erstellen Sie eine Instanz der WMI-Systemklasse __EventFilter.

  2. Erstellen Sie einen eindeutigen Bezeichner für Ihren Filter mit der Eigenschaft Name auf zwei möglichen Arten:

    • Verwenden Sie ein privates Schema.

      Die willkürliche Benennung Ihrer Ereignisfilter funktioniert, solange Sie nicht mit anderen Filterbenennungsschemas in Konflikt geraten. Sie müssen Benennungskonflikte vermeiden, da das Hinzufügen einer Instanz mit einem doppelten Wert Name die alte Instanz überschreibt.

    • Verwenden Sie eine global eindeutige Kennung.

      Wenn Sie Name leer lassen, füllt WMI Name mit einer GUID aus.

  3. Beschreiben Sie den Typ des Ereignisses, den Sie mit der Eigenschaft Query filtern möchten.

    Die Eigenschaft Query enthält die WMI Query Language-Abfrage (WQL), die den Typ des Ereignisses beschreibt, den Sie filtern möchten. Sie können eine präzise Filterung mit einer Vielzahl von Operatoren und Erweiterungen für WQL erreichen.

    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.

    WMI ist effizienter bei der Verarbeitung restriktiver, spezifischer Abfragen als bei allgemeinen Abfragen. Durch das Erstellen einer bestimmten Abfrage können Sie unnötige Prozesskommunikation und Netzwerkdatenverkehr vermeiden. In Fällen von Ereignissen, die von einem Anbieter generiert werden, führt WMI die Filterung für den Anbieter durch. Dadurch wird sichergestellt, dass nur Ereignisse, die dem Filter entsprechen, die Kosten für die Kommunikation zwischen den Verarbeitungen verursachen. Weitere Informationen finden Sie unter Abfragen von WMI.

  4. Legen Sie die Eigenschaft QueryLanguage auf den Typ der Abfragesprache fest, die Sie in der Eigenschaft Query verwenden.

    Sie legen QueryLanguage fast immer auf "WQL" fest.

Im folgenden Codebeispiel wird ein Ereignisfilter beschrieben, der jedes Mal ein Ereignis signalisiert, wenn WMI eine Instanz der Klasse __TimerEvent im Namespace root\cimv2 erstellt.

instance of __EventFilter as $FILTER
{
    Name = "MyFilterName";
    Query = "select * from __TimerEvent where TimerID=\"MyTimer\"";
    QueryLanguage = "WQL";
    EventNamespace = "\root\cimv2";

    // this is the Administrators SID in array of bytes format
    CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0}; 
};

Die Eigenschaft EventNamespace gibt den Namespace an, von dem die Ereignisse stammen. Sie müssen keine Instanz der Filter im Namespace erstellen, aus dem die Ereignisse stammen. Wenn Sie den Namespace nicht angeben, erstellt WMI den Filter im Standardnamespace. Die systeminternen Ereignisklassen (z. B. __InstanceOperationEvent) sind in jedem Namespace verfügbar.

Um Ihren logischen Consumer für Ereignisbenachrichtigungen zu registrieren, müssen Sie die Ereignisfilter an einen logischen Consumer binden. Weitere Informationen finden Sie unter Bindung eines Ereignisfilters mit einem logischen Consumer.