Поделиться через


Создание фильтра событий

Фильтр событий — это класс WMI, который описывает, какие события WMI предоставляет физическому потребителю. Например, фильтр событий может указать инструментарию WMI доставить потребителю все события управления питанием или все события перезагрузки системы. Фильтр событий также описывает условия, при которых WMI доставляет события. Фильтр событий может указывать встроенное или внешние события; и фильтр может ссылаться на события, происходящие в пространстве имен, т. е. за исключением пространства имен фильтра. Постоянный потребитель должен иметь один и тот же Идентификатор CreatorSID в экземплярах потребителя, фильтра и привязки. Дополнительные сведения см. в разделе Безопасное получение событий.

В следующей процедуре описывается создание фильтра событий.

Создание фильтра событий

  1. Создайте экземпляр системного класса WMI __EventFilter .

  2. Создайте уникальный идентификатор для фильтра с помощью свойства Name одним из двух способов:

    • Используйте частную схему.

      Произвольное именование фильтров событий работает до тех пор, пока вы не конфликтуете с другими схемами именования фильтров. Необходимо избегать конфликтов именования, так как при добавлении экземпляра с повторяющимся значением Name старый экземпляр перезаписывается.

    • Используйте глобальный уникальный идентификатор (GUID).

      Если оставить имя пустым, WMI заполняет Name идентификатором GUID.

  3. Опишите тип события, которое требуется отфильтровать с помощью свойства Query .

    Свойство Query содержит запрос WMI Query Language (WQL), который описывает тип события, которое требуется отфильтровать. Вы можете добиться точной фильтрации с помощью различных операторов и расширений для WQL.

    Событие журнала NT создается при сбое запроса от постоянного потребителя события. Источник события — WinMgmt, идентификатор события — 10, а тип события — Error.

    WMI более эффективен при обработке ограничительных, конкретных запросов, чем широкие запросы. Создав определенный запрос, можно избежать ненужных межпроцессных коммуникаций и сетевого трафика. В случаях событий, созданных поставщиком, WMI выполняет фильтрацию в процессе для поставщика; это гарантирует, что только события, соответствующие фильтру, будут нести расходы на межпроцессный обмен данными. Дополнительные сведения см. в разделе Запрос WMI.

  4. Задайте для свойства QueryLanguage тип языка запросов, используемый в свойстве Query .

    Вы почти всегда устанавливаете для QueryLanguage значение WQL.

В следующем примере кода описывается фильтр событий, который сигнализирует о событии каждый раз, когда WMI создает экземпляр класса __TimerEvent в пространстве имен 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}; 
};

Свойство EventNamespace указывает пространство имен, из которого происходят события. Вам не нужно создавать экземпляр фильтров в пространстве имен, в котором происходят события. Если пространство имен не указано, WMI создает фильтр в пространстве имен по умолчанию. Классы встроенных событий, такие как __InstanceOperationEvent , доступны в каждом пространстве имен.

Чтобы зарегистрировать логический потребитель для уведомлений о событиях, необходимо привязать фильтры событий к логическому потребителю. Дополнительные сведения см. в разделе Привязка фильтра событий к логическому потребителю.