Creazione di un filtro eventi

Un filtro eventi è una classe WMI che descrive gli eventi recapitati da WMI a un consumer fisico. Ad esempio, un filtro eventi può indicare a WMI di recapitare a un consumer tutti gli eventi di risparmio energia o tutti gli eventi di riavvio del sistema. Un filtro eventi descrive anche le condizioni in cui WMI recapita gli eventi. Un filtro eventi può specificare un evento intrinseco o estrinseco; e il filtro può fare riferimento agli eventi che hanno origine nello spazio dei nomi, ovvero diverso dallo spazio dei nomi del filtro. Il consumer permanente deve avere lo stesso CreatorSID nelle istanze del consumer, del filtro e dell'associazione. Per altre informazioni, vedere Ricezione sicura di eventi.

Nella procedura seguente viene descritto come creare un filtro eventi.

Per creare un filtro eventi

  1. Creare un'istanza della classe di sistema wmi __EventFilter .

  2. Creare un identificatore univoco per il filtro con la proprietà Name , in uno dei due modi seguenti:

    • Usare uno schema privato.

      La denominazione arbitraria dei filtri eventi funziona purché non si sia in conflitto con altri schemi di denominazione dei filtri. È necessario evitare conflitti di denominazione perché l'aggiunta di un'istanza con un valore Name duplicato sovrascrive l'istanza precedente.

    • Usare un identificatore univoco globale (GUID).

      Se si lascia vuoto Nome , WMI riempie Nome con un GUID.

  3. Descrivere il tipo di evento da filtrare con la proprietà Query .

    La proprietà Query contiene la query WQL (WMI Query Language) che descrive il tipo di evento che si desidera filtrare. È possibile ottenere filtri precisi usando un'ampia gamma di operatori ed estensioni per WQL.

    Un evento NT Log viene generato quando una query da un consumer di eventi permanente ha esito negativo. L'origine dell'evento è WinMgmt, l'ID evento è 10 e il tipo di evento è Error.

    WMI è più efficiente durante l'elaborazione di query restrittive e specifiche rispetto alle query di grandi dimensioni. Creando una query specifica, è possibile evitare comunicazioni tra processi non necessari e traffico di rete. In casi di eventi generati da un provider, WMI esegue il filtro in corso al provider; in questo modo si garantisce che solo gli eventi corrispondenti al filtro comportano il costo di comunicazione interprocesso. Per altre informazioni, vedere Esecuzione di query su WMI.

  4. Impostare la proprietà QueryLanguage sul tipo di linguaggio di query utilizzato nella proprietà Query .

    Si imposterà quasi sempre QueryLanguage su "WQL".

Nell'esempio di codice seguente viene descritto un filtro eventi che segnala un evento ogni volta che WMI crea un'istanza della classe __TimerEvent nello spazio dei nomi 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 proprietà EventNamespace specifica lo spazio dei nomi da cui hanno origine gli eventi. Non è necessario creare un'istanza dei filtri nello spazio dei nomi in cui hanno origine gli eventi. Se non si specifica lo spazio dei nomi, WMI crea il filtro nello spazio dei nomi predefinito. Le classi di eventi intrinseche, ad esempio __InstanceOperationEvent , sono disponibili in ogni spazio dei nomi.

Per registrare il consumer logico per le notifiche degli eventi, è necessario associare i filtri degli eventi a un consumer logico. Per altre informazioni, vedere Associazione di un filtro eventi con un consumer logico.