Мониторинг событий
Системные администраторы могут использовать 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 или перезапусках операционной системы. Временный потребитель событий может обрабатывать события только пока он запускается.
В следующей процедуре описывается, как создать потребителя временных событий.
Создать временного потребителя событий
Определите, какой язык программирования следует использовать.
Язык программирования определяет используемый API.
Начните кодировать временное приложение-получатель событий так же, как и при запуске приложения WMI.
Первые шаги программирования зависят от языка программирования. Как правило, вы входите в WMI и настраиваете параметры безопасности. Дополнительные сведения см. в статье Создание приложения или скрипта WMI.
Определите запрос события, который требуется использовать.
Чтобы получить некоторые типы данных о производительности, может потребоваться использовать классы, предоставляемые поставщиками высокой производительности. Дополнительные сведения см. в статьях Мониторинг данных о производительности, Определение типа события для полученияи Запросы с помощью WQL.
Решите выполнить асинхронный вызов или полусинхронный вызов и выбрать метод API.
Асинхронные вызовы позволяют избежать затрат на опрос данных. Однако полусинхронные вызовы обеспечивают аналогичную производительность с большей безопасностью. Дополнительные сведения см. в статье Вызов метода.
Выполните асинхронный или полусинхронный вызов метода и включите запрос события в качестве параметра strQuery.
Для приложений C++ вызовите следующие методы:
Для сценариев вызовите следующие методы:
Напишите код для обработки возвращаемого объекта события.
Для асинхронных запросов событий поместите код в различные методы или события приемника объектов. Для полусинхронных запросов событий каждый объект возвращается по мере получения 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см. в разделе Запуск скрипта на основе события.
В следующей процедуре описывается создание постоянного потребителя событий.
Создание постоянного потребителя событий
Зарегистрировать поставщик событий с помощью используемого пространства имен.
Некоторые поставщики событий могут использовать только определенное пространство имен. Например, __InstanceCreationEvent является встроенным событием, которое поддерживается поставщиком Win32 и зарегистрировано по умолчанию в пространстве имен \root\cimv2.
Заметка
Вы можете использовать свойство EventNamespace объекта __EventFilter в регистрации для создания сквозной подписки между пространствами имен. Подробности в разделе Реализация постоянных подписок на события между пространствами имен.
Зарегистрируйте поставщика потребителей событий в пространстве имен, где находятся классы событий.
WMI использует поставщик потребителей событий для поиска постоянного потребителя событий. Постоянный потребитель событий — это приложение, которое запускается WMI при получении события. Чтобы зарегистрировать потребителя событий, поставщики создают экземпляры __EventConsumerProviderRegistration.
Создайте экземпляр класса, представляющего постоянного потребителя событий, которого вы хотите использовать.
Классы потребителей событий являются производными от класса __EventConsumer. Задайте свойства, необходимые экземпляру потребителя событий.
Зарегистрируйте потребителя в COM с помощью служебной программы regsvr32.
Создайте экземпляр класса фильтра событий __EventFilter.
Задайте необходимые поля для экземпляра фильтра событий. Обязательные поля для __EventFilter : Name, QueryLanguageи Query. Свойство Name может быть любым уникальным именем для экземпляра этого класса. Свойство QueryLanguage всегда имеет значение "WQL". Свойство Query — это строка, содержащая запрос события. Событие генерируется, когда запрос постоянного потребителя событий терпит неудачу. Источник события — WinMgmt, идентификатор события — 10, а тип события — Error.
Создайте экземпляр класса __FilterToConsumerBinding для связывания потребителя логического события с фильтром событий.
WMI использует ассоциацию для поиска потребителя событий, связанного с событием, которое соответствует критериям, указанным в фильтре событий. WMI использует провайдера событийных потребителей для поиска и запуска приложения постоянного события.