
- •Введение
- •1. Требования к курсовой работе
- •2. Основные этапы выполнения курсовой работы
- •3. Требования к оформлению курсовой работы
- •4. Теоретические сведения
- •4.1 Основы технологии Windows Management Instrumentation
- •4.1.1 Введение
- •4.1.2 Работа с процессами и потоками в wmi
- •4.1.3 Обработка событий в wmi
- •4.1.4 Сбор информации о памяти
- •4.1.5 Планирование заданий
- •4.1.6 Работа с файловой системой
- •4.2.1 Введение
- •4.2.2 Инициализация com
- •4.2.3 Создание подключения к пространству имен wmi
- •4.2.4 Установка уровней безопасности для wmi подключения
- •4.2.5 Реализация функциональности приложения
- •4.2.6 Очистка и корректное завершение wmi приложения
- •4.3 Основные понятия технологии ole-автоматизации
- •4.4 Примеры сценариев wsh использующих ole-автоматизацию
- •5. Задания на курсовую работу по дисциплине «Системное программное обеспечение»
- •Литература
- •Приложение а
- •Оценка ________________ Дата защиты ________________ донецк - ДонНту – 200_ Приложение б
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.