Share via


Création d’un filtre d’événement

Un filtre d’événement est une classe WMI qui décrit les événements que WMI fournit à un consommateur physique. Par exemple, un filtre d’événement peut indiquer à WMI de remettre à un consommateur tous les événements de gestion de l’alimentation ou tous les événements de redémarrage du système. Un filtre d’événement décrit également les conditions dans lesquelles WMI remet les événements. Un filtre d’événement peut spécifier un événement intrinsèque ou extrinsèque. Par ailleurs, il peut faire référence à des événements qui proviennent de l’espace de noms, autrement dit, d’un emplacement autre que l’espace de noms du filtre. Le consommateur permanent doit avoir le même CreatorSID dans les instances de consommateur, de filtre et de liaison. Pour plus d’informations, consultez Réception d’événements de manière sécurisé.

La procédure suivante décrit comment créer un filtre d’événement.

Pour créer un filtre d’événement

  1. Créez une instance de la classe système WMI __EventFilter.

  2. Créez un identificateur unique pour votre filtre avec la propriété Name, de l’une des deux manières suivantes :

    • Utilisez un schéma privé.

      Le nommage arbitraire de vos filtres d’événement fonctionne tant que vous n’entrez pas en conflit avec d’autres schémas de nommage de filtre. Vous devez éviter les conflits de noms, car l’ajout d’un instance avec une valeur Name en double remplace l’ancienne instance.

    • Utilisez un identificateur global unique (GUID).

      Si vous laissez Name vide, WMI remplit Name avec un GUID.

  3. Décrivez le type d’événement que vous voulez filtrer avec la propriété Query.

    La propriété Query contient la requête WQL (WMI Query Language) qui décrit le type d’événement que vous souhaitez filtrer. Vous pouvez obtenir un filtrage précis à l’aide de divers opérateurs et d’extensions pour WQL.

    Un événement du journal NT est généré lorsqu’une requête provenant d’un consommateur d’événements permanents échoue. La source de l’événement est WinMgmt, l’ID d’événement est 10 et le type d’événement est Erreur.

    WMI est plus efficace pour traiter des requêtes spécifiques et restrictives que des requêtes larges. En créant une requête spécifique, vous pouvez éviter des communications entre processus et un trafic réseau inutiles. En cas d’événements générés par un fournisseur, WMI effectue le filtrage in-process sur le fournisseur. Cela garantit que seuls les événements correspondant au filtre entraînent des frais de communication entre processus. Pour plus d'informations, consultez Interrogation de WMI.

  4. Définissez la propriété QueryLanguage sur le type de langage de requête que vous utilisez dans la propriété Query.

    Vous définissez presque toujours QueryLanguage sur « WQL ».

L’exemple de code suivant décrit un filtre d’événement qui signale un événement chaque fois que WMI crée un instance de la classe __TimerEvent dans l’espace de noms root\cimv2.

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}; 
};

La propriété EventNamespace spécifie l’espace de noms d’où proviennent les événements. Vous n’avez pas besoin de créer une instance des filtres dans l’espace de noms d’où proviennent les événements. Si vous ne spécifiez pas l’espace de noms, WMI crée le filtre dans l’espace de noms par défaut. Les classes d’événements intrinsèques, telles que __InstanceOperationEvent sont disponibles dans chaque espace de noms.

Pour inscrire votre consommateur logique pour les notifications d’événements, vous devez lier les filtres d’événement à un consommateur logique. Pour plus d’informations, consultez Liaison d’un filtre d’événement à un consommateur logique.