Creación de un filtro de eventos

Un filtro de eventos es una clase WMI que describe qué eventos entrega WMI a un consumidor físico. Por ejemplo, un filtro de eventos puede indicar a WMI que entregue a un consumidor todos los eventos de administración de energía o todos los eventos de reinicio del sistema. Un filtro de eventos también describe las condiciones en las que WMI entrega los eventos. Un filtro de eventos puede especificar un evento intrínseco o extrínseco; y el filtro pueden hacer referencia a los eventos que se originan en el espacio de nombres, es decir, distinto del espacio de nombres del filtro. El consumidor permanente debe tener el mismo CreatorSID en las instancias de consumidor, filtro y enlace. Para más información, consulte Recepción de eventos de forma segura.

En el procedimiento siguiente se describe cómo crear un filtro de eventos.

Para crear un filtro de evento

  1. Cree una instancia de la clase del sistema __EventFilter de WMI.

  2. Cree un identificador único para el filtro con la propiedad Name de una de estas dos maneras:

    • Use un esquema privado.

      La asignación de un nombre arbitrario a los filtros de eventos funciona siempre que no entre en conflicto con otros esquemas de nomenclatura de filtros. Debe evitar conflictos de nomenclatura porque al agregar una instancia con un valor Name duplicado se sobrescribe la instancia anterior.

    • Use un identificador único global (GUID).

      Si deja el campo Name, WMI rellena Name con un GUID.

  3. Describa el tipo de evento que desea que se filtre con la propiedad Query.

    La propiedad Query contiene la consulta WMI Query Language (WQL) que describe el tipo de evento que desea que se filtre. Puede lograr un filtrado preciso mediante una variedad de operadores y extensiones para WQL.

    Se genera un evento Registro de NT cuando se produce un error en una consulta en un consumidor de eventos permanente. El origen del evento es WinMgmt, el identificador del evento es 10 y el tipo de evento es Error.

    WMI es más eficaz en el procesamiento de consultas restrictivas y específicas que en el de consultas amplias. Al crear una consulta específica, puede evitar la comunicación entre procesos y el tráfico de red innecesarios. En los casos de los eventos generados por un proveedor, WMI realiza el filtrado en proceso al proveedor, lo que garantiza que solo los eventos que coincidan con el filtro incurren en el costo de comunicación entre procesos. Para más información, vea Consulta de WMI.

  4. Establezca la propiedad QueryLanguage en el tipo de lenguaje de consulta que use en la propiedad Query.

    Casi siempre establecerá QueryLanguage en "WQL".

En el siguiente ejemplo de código se describe un filtro de eventos que señala a un evento cada vez que WMI crea una instancia de la clase __TimerEvent en el espacio de nombres 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 propiedad EventNamespace especifica el espacio de nombres desde el que se parten los eventos. No es necesario crear una instancia de los filtros en el espacio de nombres en el que se originan los eventos. Si no especifica el espacio de nombres, WMI crea el filtro en el espacio de nombres predeterminado. Las clases de eventos intrínsecos, como __InstanceOperationEvent, están disponibles en todos los espacios de nombres.

Para registrar el consumidor lógico para las notificaciones de eventos, debe enlazar los filtros de eventos a un consumidor lógico. Para más información, vea Enlace de un filtro de eventos con un consumidor lógico.