
- •Утиліти і засоби для роботи з wmi
- •Підключення до wmi
- •Робота з об'єктами sWbemServices і sWbemObject
- •Як дістатися до конкретного об'єкту: мова запитів wql
- •Робота з подіями
- •6.1 Архітектура роботи з подіями в wmi
- •6.2 Типи подій
- •6.3 Запит, реєструючий подію
- •Класи wmi
- •7.1 Класи wmi для роботи з устаткуванням
- •7.2 Класи для роботи з операційною системою
- •Робота із службами
- •Робота з файлами і каталогами
- •Робота з журналом подій Windows
- •Об'єкт операційної системи - Win32_OperatingSystem
- •Робота з Win32_Process : запуск, завершення роботи, моніторинг процесів на комп'ютері
- •Інші класи для роботи з операційною системою
- •7.3 Класи для роботи зі встановленими продуктами
- •Практичне завдання:
6.2 Типи подій
Будь-яка подія в WMI представляється у вигляді екземпляра класу _Event, проте усі події розділяються на три основні категорії:
intrisinc events - події, які вбудовані в модель CIM і до них можна звертатися відразу ж (ніяких драйверів встановлювати не потрібно). Систему таких подій змінювати не можна - вони заздалегідь зумовлені і вбудовані в WMI;
extrinsic events - зовнішні події, для відстежування яких потрібні спеціальні драйвери - extrinsicevent providers. Для роботи з ними необхідно, окрім установки таких драйверів, ще і помістити класи таких подій в репозитарий WMI. Разом з WMI поставляються два зовнішні провайдери - для реакції на події SNMP і для відстежування подій реєстру
timer events - події таймера, найпростіші події для перехоплення. Можна використовувати як події абсолютного часу (спрацює у вказаний вами час), так і відносні (через півгодини після запуску скрипта).
6.3 Запит, реєструючий подію
Для того, щоб зареєструвати подію і мати можливість на нього реагувати, необхідно за допомогою методу 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
В цьому випадку при будь-якому внесенні змін до облікових записів на комп'ютері, до якого ми підключилися (якщо цей комп'ютер - контроллер домена, то при будь-якому внесенні змін до домена) у нас в стандартну консоль виводу виводитиметься ім'я цього облікового запису.