Содержание
Цель работы: научиться разрабатывать временные обработчики событий
WMI в виде сценариев на языке VBScript.
Введение
Внутри 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 (Листинг 3.1).
Листинг 3.1. Обработка одиночного события.
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
В сценарии (Листинг 3.1) происходит ожидание наступления первого события, вызванного созданием, модификацией, либо удалением экземпляра класса Win32_Process; выводится имя класса события, информация о процессе, вызвавшем событие и время. В данном сценарии происходит обработка только одного события. Для того чтобы опрос происходи постоянно, необходимо поместить в сценарий бесконечный цикл (Листинг 3.2).
Листинг 3.3. Обработка событий в цикле.
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.
Ход работы
1. Составить сценарий выполняющий запуск определенного приложения, ожидание его завершения и вывод на экран информации о времени его работы в формате:
Время запуска: 12:10:00
Время завершения: 12:15:10
Длительность работы: 00:05:10
3. Составить сценарий запрещающий запуск определенного приложения. При попытке запуска данного приложения, его работа должна быть завершена, и на экран должно быть выведено сообщение о попытке запуска. Если количество разрешенных копий больше 0, то запрещать запуск необходимо только экземпляры приложения, превышающие указанное число.
Приложение и количество разрешенных копий выбираются по варианту из табл. 3.1.
Таблица 3.1
Варианты заданий для запуска процесса
№ в-та | Приложение | Количество разрешенных копий | |
исполняемый файл | название | ||
1 | notepad.exe | Notepad | 2 |
2 | calc.exe | Calculator | 3 |
3 | charmap.exe | Character Map | 1 |
4 | clipbrd.exe | ClipBook Viewer | 0 |
5 | eventvwr.exe | Event Viewer | 1 |
6 | mplay32.exe | Media Player | 3 |
7 | osk.exe | On-Screen Keyboard | 0 |
8 | perfmon.exe | Performance Monitor | 0 |
9 | taskmgr.exe | Windows Task Manager | 0 |
10 | write.exe | WordPad | 2 |
11 | telnet.exe | Microsoft Telnet Client | 0 |
12 | cmd.exe | Command Line | 1 |
Контрольные вопросы
- Назначение службы работы с событиями WMI.
- Регистрация событий.
- Метод ExecNotificationQuery() объектов класса SWbemServices.
- Синтаксис WQL запроса регистрации события.
- Класс InstanceOperationEvent и его подклассы.
- Класс SWbemEventSource.
- Метод NextEvent класса SWbemEventSource.
- Объект TargetInstance.
Отзывы
Отзывов пока нет.