Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
21
WMI (Windows Management Instrumentarium) - це реалізація Microsoft ініціативи WBEM (Web - BasedEnterprise Management), оголошеної консорціумом фірм і спрямованої на зниження загальної вартості володіння мережею. WMI використовується для створення скриптів для повного управління Windows, у тому числі:
WMI поставляється у складі Windows 2000, Windows XP і Windows Server 2003, на Windows 98, ME і NT його треба заздалегідь встановлювати (дистрибутиви - на Web -сайте Microsoft).
Архітектура WMI складається з 4 головних компонентів.
Перший компонент - застосування, що управляють. Як правило, це застосування або служби Windows, які отримують дані від WMI. Зазвичай вони забезпечують можливість взаємодії користувача сWMI. У нашій ситуації роль застосувань, що управляють, гратимуть скрипти. Стандартні застосування, що управляють, - SMS, MOM, Tivoli, набір інструментів, що входять до складу WMI SDK і тому подібне
Другий компонент - керовані об'єкти, тобто ті об'єкти, доступ до яких можна отримати за допомогою WMI. Різноманітність керованих об'єктів дуже велика - від вентилятора, встановленого в системного корпусі, до, наприклад, SQL Server з усіма встановленими базами даних.
Третій компонент - провайдери WMI, тобто драйвери WMI, які дозволяють дістати доступ до якого-небудь класу об'єктів. Наприклад, в стандартному постачанні Windows присутні драйвери WMI для роботи з реєстром, журналом подій, апаратними пристроями і тому подібне
Четвертий компонент - програмне забезпечення WMI (WMI software, winmgmt.exe) і репозитарийCIM (Common Information Model). Обидва ці компоненти відповідають за надання запрошуваній засобами WMI інформації і реакцію на виклик методів, проте у них існує розподіл обов'язків : WMI software відповідає за динамічну інформацію WMI (те, що безпосередньо береться від операційної системи, устаткування і тому подібне), а репозитарий CIM - за статичну інформацію (грубо кажучи, налаштування WMI на цьому комп'ютері). Фізично цей репозитарий розташований у файлі CIM.REP в каталозі C :\WINNT\system32\wbem\Repository.
Основний набір стандартних засобів для роботи з WMI поставляється разом з WMI SDK. До складу SDKвходят:
Ще один засіб для роботи з WMI - консоль WMI Control. Вона доступна, наприклад, з ComputerManagement і призначена в основному для адміністрування служби WMI (резервне копіювання і відновлення репозитария, налаштування системи безпеки і тому подібне)
Просте, але в деяких ситуаціях дуже зручний засіб - Scriptomatic, яке можна викачати з Web -сайта Microsoft. Цей засіб реалізований у вигляді застосування HTML (HTA) і призначений для автоматичного створення скрипта, що виводить інформацію про значення усіх властивостей усіх екземплярів якого-небудь класу WMI. Може використовуватися як швидкий броузер по класах WMI.
Дуже зручна можливість - встановити ODBC -драйвер для WMI і дістати можливість працювати з WMI як з великою базою даних зі значною кількістю таблиць. Драйвер ODBC лежить на дистрибутиві Windows 2000 Advanced Server в каталозі D :\VALUEADD\MSFT\MGMT\WBEMODBC. Після установки у вас з'явиться системне джерело даних під назвою WBEM Source і довідка по ньому у вигляді файлу Wbemdr32.chm. Головне - не заповнювати ім'я користувача і пароль для підключення, тому що при підключенні виникне помилка. Якщо ви хочете підключитися до локального комп'ютера, екран властивостей підключення з Access повинен виглядати так, як вказано на малюнку 1:
Мал. 1
Потім треба натиснути на кнопку OK і у вікні Namespace Selection вибрати потрібний простір імен (як правило, CIMV2).
Незважаючи на усі перераховані вище можливості, все-таки головний інструмент для роботи з WMI (як записано в документації по WMI) - це скрипти.
Перше, що необхідно зробити в скрипті - підключитися до служби WMI на локальному або видаленому комп'ютері. Підключення можна виконувати двома різними способами: за допомогою объектаSwbemLocator або (більш стандартний спосіб) за допомогою так званого моникера.
Перший спосіб виглядає так:
1) спочатку отримуємо об'єкт SwbemLocator :
Dim oLocator
Set oLocator = CreateObject("wbemScripting.Swbemlocator")
У об'єкту SwbemLocator - усього лише одна властивість і один метод - властивість security_ використовується для отримання посилання на однойменний вкладений об'єкт, і як можна здогадатися, використовується для налаштування безпеки при підключенні (якщо вона відрізняється від параметрів за умовчанням), а метод ConnectServer використовується для підключення до служби WMI на локальному або видаленому комп'ютері. Якщо ви підключаєтеся до служби WMI на локальному комп'ютері, скористатися правами іншого користувача (відмінного від поточного) вам не вдасться - такі обмеження служби DCOM.
2) далі викликаємо метод ConnectServer, який повертає нам об'єкт SWbemServices, :
Dim oServices
Set oServices = oLocator.ConnectServer("LONDON", "CIMV2")
Якщо ми збираємося підключитися до простору імен за умовчанням (настроюється з консолі ComputerManagement, за умовчанням CIMV2) на локальному комп'ютері, то виклик методу може виглядати так:
Set oServices = oLocator.ConnectServer()
3) отриманий об'єкт SWbemServices можна використовувати для виконання запитів WQL, отримання посилань на об'єкти WMI і тому подібне
Другий спосіб підключення до WMI (практично стандартний) - використання моникера. Моникер - це спеціальна мітка, яка використовується для підключення до COM -объектам. При використанні моникера синтаксис виходить коротшим і гнучкішим (хоча, можливо, менш зрозумілим).
Найпростіший спосіб використання моникера - застосування синтаксису виду
Dim oSvc
Set oSvc = GetObject("WinMgmts:")
В цьому випадку ми отримуємо той же об'єкт SWbemServices з параметрами за умовчанням: тобто підключаємося до простору імен Root\CIMV2 на локальному комп'ютері з правами користувача, від імені якого був запущений скрипт.
На жаль, в PrimalScript підказок за властивостями і методами ми позбавляємося. Якщо вони дуже потрібні, то можна використовувати редактор VBA з синтаксисом виду
Dim oSvc As SWbemServices
Set oSvc = GetObject("WinMgmts:")
Як додаткові параметри при визначенні моникера можна вказати рівень имперсонации (за умовчанням -
GetObject("WinMgmts:{impersonationLevel=impersonate}"),
означає роботу з правами поточного користувача і регіональні налаштування підключення. Наприклад, щоб підключитися з англійськими регіональними налаштуваннями, можна використовувати синтаксис виду GetObject("WinMgmts:[Locale = ms_409]").
Далі моникеру можна передати інформацію про те, до чого ми підключаємося:
1) імені комп'ютера
2) простору імен в нім
3) об'єкту в цьому просторі імен
Наприклад, щоб підключитися до комп'ютера Vancouver, можна використовувати синтаксис
Set oSvc = GetObject("WinMgmts://Vancouver")
Щоб підключитися на нім до простору імен ROOT\CIMV2 (зазвичай робота виконується тільки з ним, це ж простір імен вибирається за умовчанням, тому звичайний простір імен не вказується), синтаксис може виглядати так:
Set oSvc = GetObject(“WinMgmts://Vancouver/root/cimv2”)
А щоб підключитися на нім до об'єкту, що представляє систему логічних дисків, синтаксис може бути таким:
Set oSvc = GetObject(“WinMgmts://Vancouver/root/cimv2:Win32_LogicalDisk”)
В принципі, можна підключитися і безпосередньо до об'єкту логічного диска, наприклад, C :. Синтаксис при цьому може виглядати так:
Set oSWbemObject = _ GetObject(“WinMgmts://Vancouver/root/cimv2:Win32_LogicalDisk.DeviceID=C:”)
Але це вже виходить запит WQL, про яких буде розказано нижче. Крім того, повертається не объектSWbemServices, як в попередніх випадках, а об'єкт SWbemObject.
Не дивуйтеся, якщо де-небудь в коді побачите слэши у зворотний бік: синтаксис WMI допускає і те, і інше. Наприклад, код виду
Set oSvc = GetObject(“WinMgmts:\\Vancouver”)
також цілком допустимо.
Який же метод з двох вибирати?
Microsoft рекомендує використовувати тільки моникер, аргументуючи це тим, що :
1) синтаксис простіший;
2 можна повертати не лише об'єкт SWbemServices, але і відразу об'єкт SWbemObject.
Усі приклади у Microsoft побудовані тільки на використанні моникера.
Проте при використанні об'єкту SWbemLocator у нас - свої переваги:
1) тільки при використанні цього методу можна підключатися до комп'ютера з правами іншого користувача. Вимагається це не часто, але іноді все-таки вимагається;
2) можливість роботи з підказками в PrimalScript у нас зберігається.
Ну а об'єкт SWbemObject можна отримати за допомогою усього лише одного додаткового кроку - виклику методу Get об'єкту SWbemServices.
Ще раз відмітимо, що підключатися з правами іншого користувача можна тільки до видаленого комп'ютера. Якщо ви спробуєте підключитися з новими правами до служби WMI на локальному комп'ютері, виникне помилка.
Після того, як ви успішно підключилися до служби WMI на локальному або видаленому комп'ютері (за допомогою SWbemLocator або моникера), вам повертається посилання на об'єкт SWbemServices :
Dim oLocator
Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oSvc
Set oSvc = oLocator.ConnectServer()
MsgBox TypeName(oSvc)
Цей об'єкт - основна "робоча конячка" WMI. Для нього передбачена всього одна властивість (вже знайоме нам Security_) і 18 методів. Нижче приведені тільки найчастіше використовувані, по інших можна отримати інформацію за допомогою WMI SDK.
Для багатьох методів передбачений також варіант Async - асинхронне виконання цього методу.
У практичній роботі найчастіше нам потрібно буде отримати посилання на потрібний об'єкт WMI за допомогою методу Get або скористатися одним з методів Exec.. Про ці методи буде розказано нижче, а доки скажемо, що метод Get повертає посилання на об'єкт SWbemObject, представляючий вказаний вами объектWMI. Синтаксис може бути таким:
Dim oWbemObj
Set oWbemObj = oSvc.Get("Win32_LogicalDisk.DeviceID='C:'")
Відразу скажемо, що SWbemObject - це не сам об'єкт WMI, що пролягає нижче, а усього лише оболонка, в яку одягнений цей об'єкт. Наприклад, у отриманого нами об'єкту SWbemObject немає ні властивості FreeSpace, ні властивості FileSystem, ні властивості VolumeName. Зате за допомогою властивості Properties_ цього об'єкту ми може отримати інформацію про усі властивості об'єкту, що пролягає нижче, а за допомогою властивості Methods_ - про усі методи. Щоб випадково не переплутати властивості SWbemObject і об'єкту, що пролягає нижче, назви усіх властивостей і методів SWbemObject закінчуються на підкреслення.
Система WMI спочатку побудована так, щоб вона була певною мірою самодокументируемой- наприклад, щоб інформацію про усі властивості і методи об'єктах WMI можна було отримати не за допомогою переглядача об'єктів, а просто з коду скрипта. Наприклад, щоб отримати інформацію про усі властивості об'єкту WMI, що представляє диск "C:", можна використовувати код виду
For Each item In oWbemObj.Properties_
WScript.Echo item.Name & vbTab & item.Value
Next
а для отримання інформації про методи - таку ж конструкцію.
For Each item In oWbemObj.Methods_
WScript.Echo item.Name
Next
У першому випадку властивість Properties повертає нам стандартну колекцію SWbemPropertySet із звичайними властивостями і методами типу Add, Remove, Item, Count, яка складається з объектовSWbemProperty. Найважливіші властивості SWbemProperty такі:
Для методів усе влаштовано точно також: властивість Methods_повертає колекцію SWbemMethodSet, що складається з об'єктів SWbemMethod. Найважливіші властивості цього об'єкту - Name, Qualifiers, InParameters, OutParameters.
Творці WMI настійно рекомендують працювати з об'єктами WMI через їх оболонку - SWbemObject. Наприклад, щоб отримати інформацію про значення властивості Freespace для нашого диска C :, можна використовувати синтаксис виду
For Each item In oWbemObj.Properties_
If item.Name = "FreeSpace" Then MsgBox item.value/1024/1024
Next
а щоб поміняти значення властивості, можна скористатися кодом виду :
For Each item In oWbemObj.Properties_
If item.name = "VolumeName" Then item.value = "System"
Next
oWbemObj.put_
Виклик методу put_ тут обов'язковий, інакше значення зміниться тільки в оперативній пам'яті, а не на комп'ютері.
Для виклику методу об'єкту WMI рекомендується скористатися методом ExecMethod_:
Set process = GetObject("winmgmts:{impersonationLevel=impersonate}!Win32_Process")
Set method = process.Methods_("Create")
Set inParam = method.inParameters.SpawnInstance_()
inParam.CommandLine = "calc.exe"
Set outParam = process.ExecMethod_("Create", inParam)
Тут ми викликаємо метод Create об'єкту process (типу SWbemObject) і передаємо йому параметрCommandLine. Параметр - той же самий об'єкт SWbemObject, який створюється небагато химерним способом, - через колекцію inParameters.
Незважаючи на рекомендації Microsoft, більшість розробників звертаються до властивостей і методів об'єктів WMI не через колекції Properиties_ і Methods_ об'єкту SWbemObject, а безпосередньо. Для цього використовується той же самий SWbemObject. Синтаксис звернення до властивості при цьому може виглядати так:
MsgBox oWbemObj.VolumeName
а синтаксис виклику методу :
Dim oLocator
Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oSvc
Set oSvc = oLocator.ConnectServer()
Dim oWbemObj
Set oWbemObj = oSvc.Get("Win 32_Process")
oWbemObj.Create ("calc.exe")
Не дивлячись на те, що властивості і методи методу, що пролягає нижче, не видно з переглядача, вони цілком доступні.
Основна функціональність WMI знаходиться у властивостях і методах об'єктів цієї бібліотеки. Як працювати з властивостями і методами цих об'єктів, ми вже поговорили, тепер - про те, як можна знайти потрібний об'єкт.
Найпростіший варіант - отримати колекцію усіх об'єктів певного класу. Для цієї мети можна використовувати метод InstancesOf об'єкту SWbemServices. Цей метод завжди повертає колекцію, навіть якщо вона складається тільки з одного об'єкту. Для того, щоб дістати доступ до елементів цієї колекції, найпростіше використовувати давно знайому нам конструкцію For .. Each :
Dim oLocator
Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oSvc
Set oSvc = oLocator.ConnectServer()
Dim oCol
Set oCol = oSvc.InstancesOf("win 32_product")
For Each item In oCol
WScript.Echo item.Name
Next
Відфільтрувати потрібний об'єкт можна, наприклад, так:
Dim oCol
Dim oProductOffice
Set oCol = oSvc.InstancesOf("win 32_product")
For Each item In oCol
If (InStr(item.name, "Microsoft Office")<> 0) Then
Set oProductOffice = Item
End If
Next
MsgBox oProductOffice.Name
Проте, звичайно, з точки зору продуктивності такий підхід важко визнати найправильнішим. Нам доводиться поміщати посилання на усі встановлені продукти в колекцію і перебирати її, щоб знайти потрібний. Набагато зручніше скористатися вбудованим в WMI мовою запитів - WQL (WMI QueryLanguage, інша назва - SQL for WMI). Ця мова позиціонується як ANSI SQL -совместимый, хоча обмежень у нього дуже багато (наприклад, за допомогою його не можна змінювати дані - операторів INSERT, UPDATE, DELETE в нім не передбачено).
У WQL передбачено три типи запитів :
1) запити до даних - вони будуть розглянуті нижче
2) запити до подій - вони будуть розглянуті в наступному розділі
3) запити до структури WMI - вони дозволяють інформацію про структуру класів WMI. У практичній роботі використовуються нечасто і тому розглядатися тут не будуть.
Загальний синтаксис запиту WQL виглядає так:
SELECT властивості FROM ім'я_класу WHERE властивість оператор значення
Якщо використовувати запит WQL в нашому прикладі для отримання інформації про встановлені продукти, то в найпростішому варіанті він може виглядати так:
Dim oCol
Set oCol = oSvc.ExecQuery("select * from Win32_Product")
For Each item In oCol
WScript.Echo item.Name
Next
Якщо ми, як в звичайному SQL, вкажемо тільки потрібні нам стовпці, повернеться та ж колекція вже знайомих нам об'єктів SWbemObject, але тільки з вказаними нами властивостями плюс властивість, яка визначена як ключове. У прикладі нижче повернеться явно вказана нами властивість Version і ключова властивість Name. Якщо спробуємо звернутися ще і до властивості InstallState, виникне помилка:
Dim oCol
Set oCol = oSvc.ExecQuery("select version from Win32_Product")
For Each item In oCol
Wscript.Echo item.Version
WScript.Echo item.Name
WScript.Echo TypeName(item)
Next
Вираження FROM в WQL -запросе - це, звичайно, ім'я класу, колекцію екземплярів якого ми хочемо отримати. Про доступних в WMI класах буде розказано нижче.
Вираження WHERE визначає фільтр в запиті - таким чином ми залишаємо в колекції тільки ті об'єкти, які нам потрібні, :
Dim oCol
Set oCol = oSvc.ExecQuery("select * from Win32_Product WHERE description = _
'' Microsoft Office - професійний випуск версії 2003'")
For Each item In oCol
WScript.Echo item.Name
Next
Із застосуванням фільтру WHERE пов'язані деякі особливості, які необхідно враховувати, :
SELECT * FROM CIM_MediaAccessDevice WHERE __CLASS = _ 'Win32_CDROMDrive'
Зверніть увагу, що перед словом __CLASS коштує подвійне підкреслення.
SELECT * FROM Win32_Fan WHERE Description IS Null
Є ще спеціальний оператор ISA, який використовується для перевірки значень властивостей вкладених класів. На жаль, оператор LIKE в WQL не використовується.
Запити WQL дуже зручно тестувати з CIM Studio з постачання WMI SDK.
Усередині служби WMI реалізована служба роботи з подіями - WMI Event Service. Ця служба підтримує фільтрацію подій і забезпечення реакції на них.
Скрипт, застосування або просто адміністратор (за допомогою утиліти CIM Event Registration) можуть зареєструвати підписку на події, виступивши в ролі будівника підписки - Subscriber Builder. Події представляються у вигляді системного класу _Event, на появу яких реагує підписка.
Підписка (subscription) - визначення події, що представляє інтерес для будівника події. Фактично підписка - це вимога для служби WMI виконати певні дії, якщо станеться подія, що підпадає під умову підписки. Підписка створюється за допомогою специальногоWQL -запроса (SELECT). Настійно рекомендується визначити в цьому запиті максимально строгі умови - щоб уникнути обробки непотрібних вам подій.
Ще один компонент архітектури роботи з подіями - одержувач події, Event Consumer. Цей той блок коду в скрипті (чи застосуванні), який отримує повідомлення про настання події і реагує на нього. Одержувачі можуть бути тимчасовими і постійними.
Тимчасові одержувачі - це одержувачі, яким передаватимуться сповіщення про події тільки тоді, коли цей скрипт/застосування запущений. Тимчасові одержувачі зазвичай реєструють свої події за допомогою виклику методу ExecNotificationQuery.
Інформація про постійних одержувачів зберігається в репозитарии CIM. При настанні події службаWMI перевіряє, чи запущено необхідне застосування/скрипт, яке має бути одержувачем. Якщо воно запущене, то воно оповіщається, а якщо немає - те спочатку служба WMI проводить запуск цього застосування. ВWMI SDK поставляється такий постійний одержувач - WMI Event Viewer Tool. Наприклад, щоб зареєструвати постійного одержувача подій WMI (наприклад, для появи нових повідомлень в журналі застосувань), треба виконати наступні дії:
mofcomp c:\winnt\system32\wbem\eviewer.mof
((файл eviewer.mof встановлюється разом з WMI SDK)
Для перевірки створеної вами конфігурації досить виконати короткий скрипт, який згенерує повідомлень в журнал подій застосувань, наприклад:
Dim oShell
Set oShell = CreateObject("Wscript.Shell")
oShell.LogEvent 0, "TestMessage"
Якщо усе зроблено правильно, то з'явиться вікно WMI Event Viewer з інформацією про подію, що сталася.
Будь-яка подія в WMI представляється у вигляді екземпляра класу _Event, проте усі події розділяються на три основні категорії:
Для того, щоб зареєструвати подію і мати можливість на нього реагувати, необхідно за допомогою методу ExecNotificationQuery() об'єкту SWbemServices виконати запит WQL по спеціальній формі, наприклад:
Dim oE
Set oE = oSvc.ExecNotificationQuery_
("SELECT * FROM __InstanceModificationEvent " & _
"WITHIN 10 WHERE TargetInstance ISA 'Win32_Account'")
oE в даному випадку - об'єкт SWbemEventSource, про можливості якого ми поговоримо нижче.
__InstanceModificationEvent (з двома підкресленнями) - одна з дев'яти подій, на які можна настроїти реакцію, :
В даному випадку ми відстежуємо зміни, які вносяться до вже існуючих об'єктів облікових записів 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
В цьому випадку при будь-якому внесенні змін до облікових записів на комп'ютері, до якого ми підключилися (якщо цей комп'ютер - контроллер домена, то при будь-якому внесенні змін до домена) у нас в стандартну консоль виводу виводитиметься ім'я цього облікового запису.
Ми розібралися в прийомах роботи з WMI, проте залишилася ще одна важлива тема - а що фізично можна зробити за допомогою WMI, які в WMI передбачені класи, а для класів - які властивості і методи.
Класів в WMI передбачені сотні. Ми розглянемо тільки найважливіші. Усі класи поділені на три великі групи:
Ми акцентуватимемо увагу на тих можливостях, які дозволяють нам не лише отримувати пасивну інформацію, але і управляти комп'ютером.
Класи WMI для роботи з устаткуванням можна розділити на дев'ять великих категорій:
Практично усі ці класи призначені для можливості тільки отримання інформації на читання, без можливості внесення змін. Виняток становлять тільки:
Наприклад, щоб настроїти комп'ютер на використання DHCP, можна використовувати код виду :
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter In colNetAdapters
errEnable = objNetAdapter.EnableDHCP()
If errEnable = 0 Then
Wscript.Echo "DHCP has been enabled."
Else
Wscript.Echo "DHCP could not be enabled."
End If
Next
Щоб навпаки, настроїти потрібну нам статичну IP-адресу, можна використати код
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
strIPAddress = Array("192.168.1.141")
strSubnetMask = Array("255.255.255.0")
strGateway = Array("192.168.1.100")
strGatewayMetric = Array(1)
For Each objNetAdapter in colNetAdapters
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
If errEnable = 0 Then
WScript.Echo "The IP address has been changed."
Else
WScript.Echo "The IP address could not be changed."
End If
Next
За допомогою інших методів цього класу ви можете настроювати домен DNS, параметри роботи з серверами DNS і WINS, IPSec і фільтрацію пакетів TCP/IP, додавати додаткові мережеві протоколи, служби і клієнти - загалом, усе, що доступно на графічному екрані або через реєстр.
Оскільки одна з цілей WMI - забезпечити повний контроль над операційною системою, набір класів в цьому розділі дуже великий (декілька сотень). Велика частина цих класів (як і класів для роботи з устаткуванням) призначена для отримання інформації і їх властивості доступні тільки на читання. Ми розглянемо тільки ті класи, у яких існують методи, за допомогою яких можна програмно управляти комп'ютером.
Класи Win32_BaseService, Win32_Service і Win32_SystemDriver представляють служби Windows : Win32_Services - звичайні, Win32_SystemDriver - драйвери (насправді великої різниці між службами і драйверами для Windows немає і інформація про них зберігається в одній гілці реєстру), Win32_BaseServices - і те, і інше разом. У ці класів є важливі методи:
Найбільш ситуації, що часто зустрічаються, для роботи із службами:
Для усіх цих ситуацій використовуються класи Win32_BaseService. У багатьох ситуаціях їх застосування дозволить адміністраторові заощадити безліч часу.
Можливості роботи з файлами і каталогами в WMI є взаємодоповнюючими по відношенню до об'єктної моделі WSH/FSO. З одного боку, за допомогою WMI не можна, наприклад, записати інформацію в текстовий файл, з іншої - в WMI реалізовані додаткові можливості, яких немає в WSH, наприклад, можливість змінити дозволи на файл/каталог, поміняти власника, настроїти аудит, дізнатися, скільки процесів теперішній час відкрили цей файл і тому подібне. Головний клас для роботи з файловою системою в WMI - Win32_Directory, який може бути використаний для роботи як з каталогом, так і з окремим файлом. Його головні методи:
Дуже часто в практичній роботі необхідно виконувати які-небудь дії, що повторюються, з журналом подій 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 і тому подібне
Для цього об'єкту передбачена безліч цікавих властивостей, таких, як CSDVersion останній встановлений сервіс-пак, Locale мовна версія операційної системи, LastBootTime останнім часом завантаження, тип і версія операційної системи і тому подібне. Крім того, для нього передбачено три методи із зрозумілими назвами: Reboot, Shutdown, Win32Shutdown (з'являються додаткові можливості виключення).
До цього класу примикає по своїх можливостях клас Win32_OperationSystemQFE, за допомогою якого можна отримати колекцію об'єктів, що представляють усі встановлені патчи операційної системи з великою кількістю атрибутів.
Один з найчастіше використовуваних класів 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
Довше за секунду блокнот на комп'ютері користувача відкритий не буде.
Нижче перераховані деякі інші класи для роботи з операційною системою:
Остання велика категорія класів WMI - класи, призначені для роботи зі встановленими продуктами. Більшість таких класів призначені для використання в настановних скриптах розробниками програмних продуктів. Проте можливості класу Win32_Product можуть зробити дуже корисними і для звичайних адміністраторів. За допомогою цього класу можна отримати колекцію, що представляють усі встановлені продукти в Windows. Для виконання з ними різних операцій передбачений набір методів цього класу :
Наприклад для установки програми на видалений комп'ютер необхідно виконати скрипт наступного виду :
Set oSoftware = oSvc.Get("Win 32_Product")
errReturn = oSoftware.Install("\\FS1\Distrib\myApp.msi",,True)
Wscript.Echo errReturn
Відмітимо деякі моменти, пов'язані із застосуванням об'єкту Win32_Product, :
1) скопіюйте до себе з каталогу Templates на компакт-диску базу даних EventLog.mdb в кореневий каталог диска C : і зніміть з неї прапорець "Тільки для читання"
2) проглянете єдину таблицю в цій базі - Events
3) напишіть скрипт EventLogProcessing.vbs, який би :