Получение событий в любое время

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

Постоянный потребитель события получает события, пока его регистрация не будет явно отменена.

Постоянный потребитель событий — это сочетание следующих классов WMI, фильтров и COM-объектов, которые находятся в системе:

  • COM-объект, называемый физическим потребителем. WMI предоставляет несколько стандартных постоянных потребителей. Например, потребитель события активных скриптов запускает скрипт при возникновении события.
  • Новый постоянный класс потребителей.
  • Экземпляр класса постоянного потребителя, называемый логическим потребителем.
  • Фильтр, содержащий запрос на события.
  • Связь между потребителем и фильтром.

Свойства потребителя логического события определяют действия, выполняемые при уведомлении о событии, но не определяют запросы событий, с которыми они связаны. При получении сигнала WMI автоматически загружает COM-объект, представляющий постоянного потребителя события, в активную память. Как правило, это происходит во время запуска или в ответ на событие активации. После активации постоянный потребитель событий действует как обычный потребитель событий, но остается до конкретной выгрузки операционной системой.

Вы можете написать собственный постоянный потребитель событий или использовать предварительно установленные стандартные классы-получатели WMI, например ActiveScriptEventConsumer. Дополнительные сведения см. в разделах Стандартные классы потребителей, Мониторинг и реагирование на события с помощью стандартных потребителей и Мониторинг событий.

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

Создание собственного постоянного потребителя событий

  1. Определите тип событий, которые вы хотите получить.

    WMI поддерживает встроенные и внешние события. Встроенное событие — это событие, предопределенное инструментарием WMI, а событие extrinsic — это событие, определенное сторонним поставщиком. Дополнительные сведения см. в разделе Определение типа события для получения.

  2. Реализация физического потребителя.

    Main разница между приложением управления и физическим потребителем заключается в том, что пользователь загружает и выгружает приложение управления, а WMI загружает и выгружает физического потребителя. Большая часть кода должна находиться в физическом объекте-получателе.

    Примечание

    Этот шаг является первым в процедуре для простоты объяснения. С точки зрения кодирования следует фактически создать физического потребителя последним. Таким образом, вы можете указать параметры и логику для постоянного поставщика событий, прежде чем приступать к длительному написанию кода. Тем не менее, нет никаких ограничений на запись физического потребителя в первую очередь.

     

  3. Создайте класс потребителя, описывающий физического потребителя.

    Как и любой класс, класс-получатель описывает общие параметры постоянного потребителя событий для WMI.

  4. Создайте экземпляр класса потребителя.

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

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

    Запросы событий, которые активируют постоянных потребителей событий, называются фильтрами событий. Один фильтр событий можно связать с несколькими потребителями логических событий. Кроме того, с одним потребителем логического события можно связать несколько фильтров событий. Фильтр является экземпляром __EventFilter.

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

  6. Свяжите фильтр событий с логическим потребителем.

    Связав фильтр событий с логическим потребителем, вы укажете WMI о том, какой фильтр событий принадлежит логическому потребителю. Потребители логических событий и фильтры событий связаны экземпляром класса ассоциации __FilterToConsumerBinding. При получении события, соответствующего запросу события, описанному в фильтре событий, инструментарий WMI находит связанный потребитель логического события, просматривая экземпляр класса ассоциации. После обнаружения экземпляра потребителя логического события WMI использует экземпляр класса __EventConsumerProviderRegistration для поиска и запуска объекта-получателя физического события, связанного с этим экземпляром.

  7. Создание поставщика потребителя событий.

    Поставщик потребителя событий — это COM-объект, который находит физического потребителя для WMI.