WMI-сценарії 101
Сценарії WMI - це бібліотека інтерфейсів автоматизації, які розташовуються над Common Information Model Object Manager (CIMOM). COM-сумісні мови сценаріїв (наприклад, Windows Script, WS, ActivePerl) використовують інтерфейси автоматизації для доступу до інфраструктури WMI. Бібліотека Wbemdisp.dll успадковує WMI об'єкти автоматизації, методи і властивості.
Для доступу до WMI через бібліотеку сценаріїв WMI потрібно зробити три кроки, які є загальними для більшості сценаріїв WMI. Перше - необхідно підключитися до служби Windows Management service, друге - отримати екземпляри керованих об'єктів WMI, третє - викликати метод або отримати доступ до властивостей керованого об'єкта. Після знайомства з інтерфейсами, які використовуються для виконання цих трьох кроків, набагато впевненіше почуваєш себе на шляху до вершини мистецтва написання сценаріїв.
Розглянемо WMI-сценарій, який демонструє всі три кроки в дії. У лістингу 1 наведено WMI-сценарій Winmgmts.vbs.
Сценарій инициализирует дві рядкові змінні - strComputer і strProcsToKill. Ім'я цільового комп'ютера знаходиться у змінній strComputer, а змінної strProcsToKill присвоєно ім'я процесу, яке використовується в сценарії для виявлення і зупинки всіх поточних процесів з таким ім'ям. У наведеному прикладі ім'я поточного процесу notepad.exe.
Сценарій повертає кожен екземпляр Win32_ Process як SWbemObject з колекції SwbemObjectSet. SWbemObjectSet і SWbemObject - це лише два з декількох інтерфейсів, які надає бібліотека сценаріїв WMI. Так як SWbemObjectSet є колекцією, то доступ до її елементів можна організувати за допомогою конструкції For. Each мови сценаріїв VBScript (див. Лістинг 1. мітка B).
Міткою B виділена частина сценарію, яка виконує останній крок для доступу до WMI. Всередині циклу For. Each організований доступ до двом властивостям і одному методу, які визначені в класі Win32_Process. Спочатку, при виконанні сценарію, для кожного екземпляра Win32_ Process виводяться його ідентифікатор процесу ProcessID і ім'я Name. Потім ім'я поточного екземпляра процесу Win32_Process Name порівнюється зі значенням змінної strProcsToKill. Якщо ці значення збігаються, то в сценарії викликається певний в класі Win32_ Process метод знищення поточного екземпляра процесу.
Щоб зрозуміти, як працюють властивості і методи більш ніж 300 класів, що входять в CIM Win32, розглянемо властивості і методи класу Win32_ Process. Нагадаю, що клас - це шаблон, який визначає властивості і поведінку кожного екземпляра класу. CIM містить всі визначення класів для керованого оточення. У winmgmts.vbs кожен екземпляр процесу використовує методи і властивості класу Win32_Process, як власні, так і успадковані. Це справедливо для всіх класів, визначених в CIM. Дослідити класи, визначені в CIM, досить просто за допомогою програми wbemtest.exe. Інформацію про класи можна знайти в документації WMI SDK.
Модель об'єктів WMI
На рисунку 1 моделі об'єктів WMI показані основні об'єкти бібліотеки сценаріїв WMI. Об'єкти моделі надають методи і властивості, що використовуються в сценаріях для доступу і вилучення об'єктів WMI. Розглянемо по кроках, як winmgmts.vbs використовує об'єкти, які надає дана модель.
Малюнок 1. Модель об'єктів сценаріїв WMI.
Крок 1: підключення до WMI. Для підключення до WMI в сценарії застосовується монікер winmgmts. Він повертає об'єкт SwbemServices. Замість створення посилання на об'єкт Swbem Services в сценарії негайно викликається метод InstancesOf об'єкта SwbemServices.
У Таблиці 1 наведено короткий опис кожного об'єкта моделі WMI Scripting Object Model і вказані посилання на Web-сайт Microsoft, де можна знайти детальну інформацію про методи і властивості відповідного об'єкта.
У лістингу 2 наведено сценарій locator.vbs, який виконує ту ж задачу, що і winmgmts.vbs. Основна відмінність між двома прикладами в тому, що locator.vbs для доступу до об'єкта SwbemServices використовує об'єкт SwbemLocator, а не WMI-монікер. Це пояснює, чому locator.vbs застосовує VBScript-функцію CreateObject, в той час як winmgmts.vbs використовує функцію GetObject. Winmgmts.vbs використовує GetObject для роботи з монікерамі. Програмний ідентифікатор Wbem Scripting.SWbemLocator в locator.vbs вказує функції CreateObject, що необхідно створити об'єкт SWbem sLocator.
Хоча сценарії, наведені в Лістингах 1 і 2. функціонально однакові, вони демонструють дію різних механізмів, закладених в бібліотеці WMI. Новачкам може здатися, що синтаксис монікера надмірно заплутаний, тому спочатку вони можуть попрацювати з SWbem Locator. З точки зору функціональності метод Connect Server, який надає SWbemLocator, дозволяє розподіляти повноваження, необхідні для проведення аутентифікації WMI з'єднання. Синтаксис монікера надає можливість виконання декількох дій в одному рядку коду.
Об'єкти, які надає бібліотека сценаріїв WMI, дозволяють ґрунтовно підійти до розробки даних WMI. У наступній статті я планую розглянути об'єкти бібліотеки WMI з ще більш багатою функціональністю. А поки я хотів би запропонувати читачам в якості тренування модифікувати кожній із двох листингов так, щоб витягти інші класи Win32. Підказка: крім зміни імені класу, яке передається методу InstancesOf, необхідно модифікувати тіло циклу For. Each так, щоб застосовувані в циклі методи і властивості збігалися з методами і властивостями обраного класу.