
- •Утиліти і засоби для роботи з 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 Класи для роботи зі встановленими продуктами
- •Практичне завдання:
Як дістатися до конкретного об'єкту: мова запитів wql
Основна функціональність 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 пов'язані деякі особливості, які необхідно враховувати, :
за умовчанням в колекцію-результат запиту потрапляють усі екземпляри вказаного вами класу разом з їх підкласами. Якщо підкласи вам не потрібні, то фільтр WHERE може виглядати так:
SELECT * FROM CIM_MediaAccessDevice WHERE __CLASS = _ 'Win32_CDROMDrive'
Зверніть увагу, що перед словом __CLASS коштує подвійне підкреслення.
у фільтрі WHERE використовуються стандартні оператори SQL : =, <, >, <>, <=, >=. У операторів IS і IS NOT - спеціальне призначення: вони використовуються тільки для порівняння значення властивості з NULL:
SELECT * FROM Win32_Fan WHERE Description IS Null
Є ще спеціальний оператор ISA, який використовується для перевірки значень властивостей вкладених класів. На жаль, оператор LIKE в WQL не використовується.
Запити WQL дуже зручно тестувати з CIM Studio з постачання WMI SDK.