Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Программирование для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

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 (с двумя подчеркиваниями) - одно из девяти событий, на которые можно настроить реакцию:

  • __ClassCreationEvent, __ClassDeletionEvent, __ClassModificationEvent - соответственно, создание, удаление и изменение класса;
  • __InstanceCreationEvent, __InstanceDeletionEvent, __InstanceModificationEvent - создание, удаление и изменение объекта;
  • __NamespaceCreationEvent, __NamespaceDeletionEvent, __NamespaceModificationEvent - то же самое для пространства имен (используется редко).

В данном случае мы отслеживаем изменения, которые вносятся в уже существующие объекты учетных записей 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

В этом случае при любом внесении изменений в учетные записи на компьютере, к которому мы подключились (если этот компьютер - контроллер домена, то при любом внесении изменений в домен) у нас в стандартную консоль вывода будет выводиться имя этой учетной записи.

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 

 
© 2004-2008, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru