Отслеживание событий

Системные администраторы могут использовать WMI для мониторинга событий в сети. Пример:

  • Служба неожиданно останавливается.
  • Сервер становится недоступным.
  • Диск заполняется до 80 % емкости.
  • События безопасности передаются в журнал событий NT.

WMI поддерживает обнаружение и доставку событий потребителям событий, так как некоторые поставщики WMI являются поставщиками событий. Дополнительные сведения см. в разделе Получение события WMI.

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

В этой статье рассматриваются следующие разделы:

Использование временных потребителей событий

Временные потребители событий — это скрипты или приложения, которые возвращают события, соответствующие запросу или фильтру событий. Запросы временных событий обычно используют IWbemServices::ExecNotificationQuery в приложениях C++ или SWbemServices.ExecNotificationQuery в скриптах и Visual Basic.

Запрос события запрашивает экземпляры класса событий, который указывает определенный тип события, например Win32_ProcessTrace или RegistryKeyChangeEvent.

Следующий пример кода VBScript запрашивает уведомление при создании экземпляра Win32_ProcessTrace . Экземпляр этого класса создается при запуске или остановке процесса.

Чтобы выполнить скрипт, скопируйте его в файл с именем event.vbs и используйте следующую командную строку: cscript event.vbs. Вы можете просмотреть выходные данные скрипта, запустив Notepad.exe или любой другой процесс. Скрипт останавливается после запуска или остановки пяти процессов.

Этот скрипт вызывает SWbemServices.ExecNotificationQuery, который является полусинхронной версией метода . Пример настройки асинхронной подписки на временные события путем вызова SWbemServices.ExecNotificationQueryAsync см. в следующем скрипте. Дополнительные сведения см. в разделе Вызов метода. Скрипт вызывает SWbemEventSource.NextEvent для получения и обработки каждого события по мере поступления. Сохраните скрипт в файле с расширением VBS и запустите его в командной строке с помощью CScript: cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Временные потребители событий должны запускаться вручную и не должны сохраняться при перезапусках WMI или при перезапусках операционной системы. Временный потребитель событий может обрабатывать события только во время выполнения.

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

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

  1. Определите, какой язык программирования следует использовать.

    Язык программирования определяет используемый API.

  2. Начните кодировать временное приложение-получатель событий так же, как вы запускаете приложение WMI.

    Первые шаги программирования зависят от языка программирования. Как правило, вы входите в WMI и настраиваете параметры безопасности. Дополнительные сведения см. в разделе Создание приложения или скрипта WMI.

  3. Определите запрос события, который вы хотите использовать.

    Чтобы получить некоторые типы данных о производительности, может потребоваться использовать классы, предоставляемые высокопроизводительными поставщиками. Дополнительные сведения см. в разделах Мониторинг данных производительности, Определение типа получаемого события и Запросы с помощью WQL.

  4. Выберите асинхронный или полусинхронный вызов и выберите метод API.

    Асинхронные вызовы позволяют избежать затрат на опрос данных. Однако полусинхронные вызовы обеспечивают аналогичную производительность с более высокой безопасностью. Дополнительные сведения см. в разделе Вызов метода.

  5. Выполните асинхронный или полусинхронный вызов метода и включите запрос события в качестве параметра strQuery .

    Для приложений C++ вызовите следующие методы:

    Для сценариев вызовите следующие методы:

  6. Напишите код для обработки возвращенного объекта события.

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

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

Вместо вызова SWbemEventSource.NextEvent для получения каждого события скрипт имеет обработчик событий для события SWbemSink OnObjectReady .

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Примечание

Асинхронный обратный вызов, например обратный вызов, обрабатываемый SINK_OnObjectReady подпрограммой, позволяет пользователю без проверки подлинности предоставлять данные в приемник. Для повышения безопасности используйте полусинхронный или синхронный обмен данными. Дополнительные сведения см. в следующих разделах:

 

Использование постоянных потребителей событий

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

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

В следующем списке указаны части, необходимые для создания постоянного потребителя событий.

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

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

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

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

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

  1. Зарегистрируйте поставщик событий в используемом пространстве имен.

    Некоторые поставщики событий могут использовать только определенное пространство имен. Например, __InstanceCreationEvent — это встроенное событие, поддерживаемое поставщиком Win32 и зарегистрированное по умолчанию в пространстве имен \root\cimv2.

    Примечание

    Для создания подписки между пространствами имен можно использовать свойство EventNamespace__EventFilter , используемого в регистрации. Дополнительные сведения см. в разделе Реализация постоянных подписок на события между пространствами имен.

     

  2. Зарегистрируйте поставщик потребителя событий в пространстве имен, в котором находятся классы событий.

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

  3. Создайте экземпляр класса , который представляет постоянный потребитель событий, который вы хотите использовать.

    Классы потребителей событий являются производными от класса __EventConsumer. Задайте свойства, необходимые экземпляру потребителя события.

  4. Зарегистрируйте потребителя в COM с помощью служебной программы regsvr32 .

  5. Создайте экземпляр класса фильтра событий __EventFilter.

    Задайте обязательные поля для экземпляра фильтра событий. Обязательные поля для __EventFilter : Name, QueryLanguage и Query. Свойство Name может быть любым уникальным именем для экземпляра этого класса. Свойство QueryLanguage всегда имеет значение WQL. Свойство Query — это строка, содержащая запрос события. Событие создается при сбое запроса постоянного потребителя события. Источник события — WinMgmt, идентификатор события — 10, а тип события — Error.

  6. Создайте экземпляр класса __FilterToConsumerBinding , чтобы связать объект-получатель логического события с фильтром событий.

    WMI использует связь для поиска потребителя события, связанного с событием, которое соответствует критериям, указанным в фильтре событий. WMI использует поставщик потребителя событий для поиска приложения постоянного потребителя событий для запуска.