|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
16.7.3 Запрос, регистрирующий событиеСобытийные запросы WQL в скриптах WMI на VBScript, метод ExecNotificationQuery(), события __InstanceCreationEvent, __InstanceDeletionEvent, __InstanceModificationEvent, оператор WITHIN 10, свойство TargetInstance, метод NextEvent() Для того, чтобы зарегистрировать событие и иметь возможность на него реагировать, необходимо при помощи метода ExecNotificationQuery() объекта SWbemServices выполнить запрос WQL по специальной форме, например: Dim oE Set oE = oSvc.ExecNotificationQuery_ ("SELECT * FROM __InstanceModificationEvent " & _ "WITHIN 10 WHERE TargetInstance ISA 'Win32_Account'") oE в данном случае - объект SWbemEventSource, про возможности которого мы поговорим ниже. __InstanceModificationEvent (с двумя подчеркиваниями) - одно из девяти событий, на которые можно настроить реакцию:
В данном случае мы отслеживаем изменения, которые вносятся в уже существующие объекты учетных записей Windows 2000, поэтому используется событие __InstanceModificationEvent. Оператор WITHIN 10 говорит о том, что опрос будет производиться каждые 10 секунд (чтобы не расходовать лишние системные ресурсы). К этому оператору можно добавлять выражение GROUP BY: сгруппированные по какому-то признаку события за период рассматриваются как одно событие и HAVING - порог на количество событий. Если количество событий ниже этого порога, то событие считается не наступившим. Полный синтаксис запроса с использованием всех этих операторов может выглядеть, например, так: SELECT * FROM __InstanceModificationEvent _ WITHIN 10 WHERE TargetInstance ISA 'Win32_PrintJob' _ GROUP WITHIN 30 BY TargetInstance.Owner _ HAVING NumberOfEvents > 5 Последняя часть запроса - WHERE TargetInstance ISA 'Win32_Account' позволяет отфильтровать источник событий. Настоятельно рекомендуется определять его как можно более точно. В данном случае оператор ISA используется, чтобы указать, что нас интересуют все вложенные классы класса Win32_Account (это будут классы Win32_SystemAccount, Win32_Group и Win32_UserAccount). Если нужно включить в запрос дополнительные условия, они включаются через AND: SELECT * FROM __InstanceModificationEvent _ WHERE TargetInstance ISA 'Win32_PrintJob' _ AND TargetInstance.Owner = 'IvanIvanov' TargetInstance - единственное свойство объекта SWbemEventSource. Оно позволяет получить ссылку на объект, который послужил источником события и, следовательно, обратиться к любому из его свойств. Мы выполнили запрос и получили объект SWbemSource. Но что с ним делать дальше? Обычно - вызывать его единственный метод NextEvent. Этот метод ожидает появления события и при ее появлении возвращает стандартный объект SWbemObject, который представляет пойманное событие. А чтобы добраться до объекта, который и вызвал это событие, как обычно для SWbemObject, используется одно из его невидимых свойств - TargetInstance. Чтобы опрос происходил постоянно, есть смысл поместить этот код в бесконечный цикл: Dim oLocator, oSvc, oEventSource, i, oWbemObject Set oLocator = CreateObject("wbemScripting.Swbemlocator") Set oSvc = oLocator.ConnectServer() Set oEventSource = oSvc.ExecNotificationQuery _ ("SELECT * FROM __InstanceModificationEvent" & _ " WITHIN 1 WHERE TargetInstance ISA 'Win32_Account'") i = 0 Do While i = 0 Set oWbemObject = oEventSource.NextEvent Wscript.Echo oWbemObject.TargetInstance.Name Loop В этом случае при любом внесении изменений в учетные записи на компьютере, к которому мы подключились (если этот компьютер - контроллер домена, то при любом внесении изменений в домен) у нас в стандартную консоль вывода будет выводиться имя этой учетной записи.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||