Partilhar via


Criando um filtro de evento

Um filtro de eventos é uma classe WMI que descreve quais eventos o WMI fornece a um consumidor físico. Por exemplo, um filtro de eventos pode instruir o WMI a entregar a um consumidor todos os eventos de gerenciamento de energia ou todos os eventos de reinicialização do sistema. Um filtro de eventos também descreve as condições sob as quais o WMI entrega os eventos. Um filtro de eventos pode especificar um evento intrínseco ou extrínseco; e o filtro pode se referir a eventos que se originam no namespace, ou seja, diferentes do namespace do filtro. O consumidor permanente deve ter o mesmo CreatorSID nas instâncias do consumidor, filtro e ligaçã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 WMI __EventFilter.

  2. Crie um identificador exclusivo para seu filtro com a propriedade Name, de uma das duas maneiras:

    • Utilize um regime 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 a adição de uma instância com um valor Name duplicado substitui a instância antiga.

    • Use um identificador global exclusivo (GUID).

      Se deixares Nome vazio, o WMI preencherá Nome com um GUID.

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

    A propriedade Query contém a consulta WQL (WMI Query Language) 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 NT Log é gerado quando uma consulta de um consumidor de evento permanente 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 realiza a filtragem em processo para o provedor; Isso garante que apenas os eventos correspondentes ao filtro incorram no custo de comunicação entre processos. Para obter mais informações, consulte Consultando o WMI.

  4. Defina a propriedade QueryLanguage para 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 cada vez 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. Não é necessário criar uma instância dos filtros no namespace de onde os eventos se originam. 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 cada namespace.

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