Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая работа СПО.doc
Скачиваний:
9
Добавлен:
21.12.2018
Размер:
333.31 Кб
Скачать

4.1.3 Обработка событий в wmi

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

Для того чтобы зарегистрировать событие и иметь возможность его обрабатывать, необходимо при помощи метода ExecNotificationQuery объекта SWbemServices выполнить запрос WQL по специальной форме, например:

Set colMonitorProcess = _

objWMIService.ExecNotificationQuery _

("SELECT * FROM __InstanceOperationEvent " & _

"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")

Данный WQL запрос возвращает экземпляры класса __InstanceOperationEvent (с двумя подчеркиваниями), которые формируются при каждом создании, удалении или модификации экземпляра WMI класса. Оператор WITHIN определяет интервал времени в секундах между опросами. WITHIN 1 говорит о том, что опрос будет производиться каждую секунду. С помощью конструкции WHERE происходит фильтрация события, при этом оператор ISA указывает необходимые события. В приведенном выше примере происходит фильтрация событий, для которых свойство TargetInstance класса __InstanceOperationEvent это экземпляр класса Win32_Process.

Класс __InstanceOperationEvent является родительским для всех событий вызываемых экземплярами WMI классов. Потомки этого класса:

__InstanceCreationEvent – появляется (создается) при создании нового экземпляра WMI класса;

__InstanceModificationEvent – создается при модификации существующего экземпляра класса;

__InstanceDeletionEvent – создается при уничтожении экземпляра класса.

При запросе __InstanceOperationEvent возвращаются все экземпляры этих трех классов.

Метод ExecNotificationQuery возвращает объект класса SWbemEventSource, в котором описан единственный метод NextEvent. Этот метод ожидает появления события, удовлетворяющего условию запроса, и при его появлении, возвращает стандартный объект SWbemObject, который представляет событие. Для получения доступа к объекту, который вызвал это событие, используется его свойство TargetInstance (Листинг 6).

Листинг 6. Обработка одиночного события.

Set objWMIService = GetObject("winmgmts:")

Set colMonitorProcess = _

objWMIService.ExecNotificationQuery _

("SELECT * FROM __InstanceOperationEvent " _

& " WITHIN 1 WHERE TargetInstance ISA " _

& "'Win32_Process'")

WScript.Echo "Ожидание события ..."

Set objLatestEvent = colMonitorProcess.NextEvent

WScript.Echo objLatestEvent.Path_.Class

Wscript.Echo "Process Name: " & _

objLatestEvent.TargetInstance.Name

Wscript.Echo "Process ID: " & _

objLatestEvent.TargetInstance.ProcessId

WScript.Echo "Time: " & Now

В сценарии (Листинг 6) происходит ожидание наступления первого события, вызванного созданием, модификацией, либо удалением экземпляра класса Win32_Process; выводится имя класса события, информация о процессе, вызвавшем событие и время. В данном сценарии происходит обработка только одного события. Для того чтобы опрос происходи постоянно, необходимо поместить в сценарий бесконечный цикл (Листинг 7).

Листинг 7. Обработка событий в цикле.

Set objWMIService = GetObject("winmgmts:")

Set colMonitorProcess = _

objWMIService.ExecNotificationQuery _

("SELECT * FROM __InstanceOperationEvent " _

& " WITHIN 1 WHERE TargetInstance ISA " _

& "'Win32_Process'")

WScript.Echo "Ожидание события ..."

Do

Set objLatestEvent = colMonitorProcess.NextEvent

WScript.Echo objLatestEvent.Path_.Class

Wscript.Echo "Process Name: " & _

objLatestEvent.TargetInstance.Name

Wscript.Echo "Process ID: " & _

objLatestEvent.TargetInstance.ProcessId

WScript.Echo "Time: " & Now

Loop

Запуск таких сценариев необходимо выполнять в консольном режиме. Для завершения – нажать комбинацию клавиш Ctrl+C.