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

Системные администраторы могут использовать инструментарий 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 использует поставщик потребителей событий для поиска приложения-получателя постоянного события для запуска.