Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_drsp_09.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
207.87 Кб
Скачать

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

В цьому випадку при будь-якому внесенні змін до облікових записів на комп'ютері, до якого ми підключилися (якщо цей комп'ютер - контроллер домена, то при будь-якому внесенні змін до домена) у нас в стандартну консоль виводу виводитиметься ім'я цього облікового запису.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]