Criar um filtro de evento

Um filtro de evento é uma classe do WMI que descreve quais eventos o WMI fornece a um consumidor físico. Por exemplo, um filtro de evento pode instruir o WMI a fornecer a um consumidor todos os eventos de gerenciamento de energia ou todos os eventos de reinicialização do sistema. Um filtro de evento também descreve as condições sob as quais o WMI entrega os eventos. Um filtro de evento pode especificar um evento intrínseco ou extrínseco; e o filtro pode se referir a eventos originados no namespace, ou seja, além do namespace do filtro. O consumidor permanente deve ter a mesma CreatorSID nas instâncias de consumidor, filtro e associação. Para obter mais informações, consulte Receber eventos com segurança.

O procedimento a seguir descreve como criar um filtro de evento.

Para criar um filtro de evento

  1. Crie uma instância da classe de sistema __EventFilter do WMI.

  2. Crie um identificador exclusivo para o filtro com a propriedade Name de duas maneiras:

    • Use um esquema privado.

      Nomear arbitrariamente seus filtros de evento funciona desde que você não entre em conflito com outros esquemas de nomenclatura de filtro. Você deve evitar conflitos de nomenclatura porque adicionar uma instância com um valor Name duplicado substitui a instância antiga.

    • Use um GUID (identificador global exclusivo).

      Se você deixar Nome vazio, o WMI preencherá Name com um GUID.

  3. Descreva o tipo de evento que deseja filtrar com a propriedade Query.

    A propriedade Query contém a consulta WQL (linguagem de consulta do WMI) que descreve o tipo de evento que você deseja filtrar. Você pode obter uma filtragem precisa usando uma variedade de operadores e extensões para WQL.

    Um evento de log NT é gerado quando uma consulta de um consumidor permanente de eventos falha. A origem do evento é WinMgmt, a ID do evento é 10 e o tipo de evento é Error.

    O WMI é mais eficiente no processamento de consultas restritivas e específicas do que consultas amplas. Ao criar uma consulta específica, você pode evitar a comunicação entre processos e o tráfego de rede desnecessários. Em casos de eventos gerados por um provedor, o WMI executa a filtragem em processo para o provedor; isso garante que apenas eventos correspondentes ao filtro incorram no custo de comunicação entre processos. Para obter mais informações, confira Consultar o WMI.

  4. Defina a propriedade QueryLanguage como o tipo de linguagem de consulta que você usa na propriedade Query.

    Você quase sempre definirá QueryLanguage como "WQL".

O exemplo de código a seguir descreve um filtro de evento que sinaliza um evento sempre que o WMI cria uma instância da classe __TimerEvent no namespace 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}; 
};

A propriedade EventNamespace especifica o namespace do qual os eventos se originam. Você não precisa criar uma instância dos filtros no namespace de origem dos eventos. Se você não especificar o namespace, o WMI criará o filtro no namespace padrão. As classes de eventos intrínsecos, como __InstanceOperationEvent estão disponíveis em todos os namespaces.

Para registrar seu consumidor lógico para notificações de eventos, você deve associar os filtros de evento a um consumidor lógico. Para obter mais informações, consulte Associar um filtro de evento a um consumidor lógico.