
- •Утиліти і засоби для роботи з 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 Класи для роботи зі встановленими продуктами
- •Практичне завдання:
Робота з журналом подій Windows
Дуже часто в практичній роботі необхідно виконувати які-небудь дії, що повторюються, з журналом подій Windows : архівувати його, завантажувати в базу даних, централізований здійснювати пошук на різних серверах на предмет виявлення специфічних подій, міняти властивості журналів, просто записувати свої події в журнал, проводити безперервний моніторинг журналів і тому подібне. Для цієї мети в WMI призначені класи Win32_NTLogEventFile (представляє журнал подій Windows) иWin32_NTLogEvent (представляє окрема подія в цьому журналі). З класом NTLogEvent усе просто - кожна його властивість відповідає окремому атрибуту події в журналі. Наприклад, отримати усі повідомлення можна так:
Dim oColEvents
Set oColEvents = oSvc.ExecQuery("Select * from Win32_NTLogEvent")
For Each Item In oColEvents
WScript.Echo Item.Message
Next
Якщо вам потрібні повідомлення тільки з конкретного журналу, або тільки помилки, або тільки від якогось джерела - фільтруємо їх засобами WQL. У Script repository можна знайти готові приклади по перекачуванню повідомлень з журналів в бази даних.
Якщо ж вам треба виконати якісь операції з самим журналом подій, у вашому розпорядженні - об'єкт Win32_EventLogFile з такими методами, як BackupEventLog, CopyEventLog, ClearEventLog і тому подібне
Об'єкт операційної системи - Win32_OperatingSystem
Для цього об'єкту передбачена безліч цікавих властивостей, таких, як CSDVersion – останній встановлений сервіс-пак, Locale – мовна версія операційної системи, LastBootTime – останнім часом завантаження, тип і версія операційної системи і тому подібне. Крім того, для нього передбачено три методи із зрозумілими назвами: Reboot, Shutdown, Win32Shutdown (з'являються додаткові можливості виключення).
До цього класу примикає по своїх можливостях клас Win32_OperationSystemQFE, за допомогою якого можна отримати колекцію об'єктів, що представляють усі встановлені патчи операційної системи з великою кількістю атрибутів.
Робота з Win32_Process : запуск, завершення роботи, моніторинг процесів на комп'ютері
Один з найчастіше використовуваних класів WMI - клас Win32_Process. За допомогою цього класу можна дістати ті можливості, яких часто не вистачає в реальній роботі, : можливість централізований запустити програми на багатьох комп'ютерах з вказаними вами параметрами, відстежити запуск/завершення програм, з'ясувати, які програми "поїдають" ресурси процесора/пам'яті/мережі і тому подібне. Особливо зручне те, що для виконання таких операцій немає необхідності ставити на комп'ютер якого-небудь клієнта видаленого доступу - служби WMI, що досить працює за умовчанням.
Щоб запустити на видаленому комп'ютері процес, треба підключитися до служби WMI на цьому комп'ютері і скористатися методом Create для Win32_Process :
Dim oLocator
Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oSvc
Set oSvc = oLocator.ConnectServer("Vancouver")
Dim oProc
Set oProc = oSvc.Get("Win32_Process")
oProc.Create "calc.exe"
Калькулятор буде вже запущений, але він буде запущений з параметрами за умовчанням - в невидимому вікні (буде видний тільки через Task Manager). Щоб змінити параметри запуску застосування (пріоритет, змінні оточення і тому подібне), можна скористатися об'єктом Win32_ProcessStartup. Проте запустити процес в інтерактивному режимі не вийде - ця можливість була прибрана починаючи з Windows 2000 SP3. Аргумент - скрипти WMI зазвичай запускаються з адміністративними правами і не можна давати користувачеві можливість використовувати вікно застосування з такими правами.
Для того, щоб примусово завершити процес, використовується метод Terminate :
Set colProcessList = osvc.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
А відстежити створення нового процесу можна так:
Set colMonitoredProcesses = oSvc. _
ExecNotificationQuery("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa 'Win32_Process'")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
Wscript.Echo objLatestProcess.TargetInstance.Name
Loop
Відстежити завершення роботи процесу можна так само, тільки замість події __instancecreationevent використовується подія __instancedeletionevent.
Якщо спільно використовувати моніторинг створення процесів і метод Terminate, можна взагалі заборонити користувачеві запускати певну програму на комп'ютері:
Set colMonitoredProcesses = oSvc. _
ExecNotificationQuery("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa 'Win32_Process'")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
If objLatestProcess.TargetInstance.Name = "notepad.exe" Then
objLatestProcess.TargetInstance.Terminate
End If
Loop
Довше за секунду блокнот на комп'ютері користувача відкритий не буде.