Condividi tramite


Creazione di un filtro eventi

Un filtro eventi è una classe WMI che descrive gli eventi che WMI recapita 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 estrino; e il filtro può fare riferimento agli eventi che hanno origine nello spazio dei nomi, ovvero diverso dallo spazio dei nomi del filtro. Il consumatore permanente deve avere lo stesso CreatorSID nelle istanze di consumatore, filtro e associazione. Per altre informazioni, vedere Ricezione di Eventi in Modo Sicuro.

La procedura seguente descrive 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à Nome, 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 Nome duplicato valore sovrascrive l'istanza precedente.

    • Usare un identificatore univoco globale (GUID).

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

  3. Descrivi il tipo di evento che vuoi filtrare con la proprietà Query.

    La proprietà query contiene la query di tipo 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 consumatore di eventi permanente ha esito negativo. L'origine dell'evento è WinMgmt, l'ID evento è 10 e il tipo di evento è Error.

    WMI è più efficiente nell'elaborazione di query restrittive e specifiche rispetto alle query generali. Creando una query specifica, è possibile evitare comunicazioni interprocessi non necessarie e il traffico di rete. Nei casi di eventi generati da un provider, WMI esegue il filtro in fase di elaborazione per il provider; in questo modo si garantisce che solo gli eventi corrispondenti al filtro comportano il costo di comunicazione interprocesso. Per altre informazioni, vedere Interrogare WMI.

  4. Impostare la proprietà QueryLanguage sul tipo di linguaggio di query che si utilizza nella proprietà Query.

    Si imposta 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 intrinseci, 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 consumatore logico.