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, alle Energieverwaltungsereignisse oder alle Systemneustartereignisse an einen Consumer 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., es handelt sich nicht um den Namespace des Filters. Der permanente Consumer muss die gleiche CreatorSID in den Consumer-, Filter- und Bindungsinstanzen aufweisen. Weitere Informationen finden Sie unter Sicheres Empfangen von Ereignissen.
Im folgenden Verfahren wird beschrieben, wie Sie einen Ereignisfilter erstellen.
So erstellen Sie einen Ereignisfilter
Erstellen Sie eine Instanz der WMI _ _ EventFilter-Systemklasse.
Erstellen Sie mit der Eigenschaft Name auf zwei Arten einen eindeutigen Bezeichner für Ihren Filter:
Verwenden Sie ein privates Schema.
Die willkürliche Benennung Ihrer Ereignisfilter funktioniert so lange, wie Sie keinen Konflikt mit anderen Filterbenennungsschemas haben. Sie müssen Namenskonflikte vermeiden, da das Hinzufügen einer Instanz mit einem doppelten Name-Wert die alte Instanz überschreibt.
Verwenden Sie eine GUID (Globally Unique Identifier).
Wenn Sie Name leer lassen, füllt WMI Name mit einer GUID aus.
Beschreiben Sie den Ereignistyp, den Sie mit der Query-Eigenschaft filtern möchten.
Die Query-Eigenschaft enthält die WQL-Abfrage (WMI Query Language), die den Typ des Ereignisses beschreibt, das gefiltert werden soll. Sie können eine präzise Filterung mit einer Vielzahl von Operatoren und Erweiterungen für WQL erreichen.
Ein NT-Protokollereignis wird generiert, wenn eine Abfrage von einem permanenten Ereignisverbraucher 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 allgemeine Abfragen. Indem Sie eine bestimmte Abfrage erstellen, können Sie unnötige prozessübergreifende Kommunikation und Netzwerkdatenverkehr vermeiden. Bei Ereignissen, die von einem Anbieter generiert werden, führt WMI die Filterung im Prozess für den Anbieter durch. Dadurch wird sichergestellt, dass nur Ereignisse, die mit dem Filter übereinstimmen, die Kosten für die prozessübergreifende Kommunikation verursachen. Weitere Informationen finden Sie unter Abfragen von WMI.
Legen Sie die QueryLanguage-Eigenschaft auf den Typ der Abfragesprache fest, die Sie in der Query-Eigenschaft 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 _ _ TimerEvent-Klasse im \ cimv2-Stammnamespace 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 EventNamespace-Eigenschaft gibt den Namespace an, aus 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 Binden eines Ereignisfilters mit einem logischen Consumer.