Знакомство с Windows Management Instrumentation (WMI)

Знакомство с Windows Management Instrumentation (WMI) WMI - администрирование Windows

Приветствую всех читателей моего блога, подписчиков, гостей и просто случайных прохожих, настало время познакомить вас с таким полезным и мощным инструментом администрирования как Windows Management Instrumentation, вкратце просто WMI. Данный инструмент является частью операционной системы Windows, и что еще лучше, сценарии сервера Windows Script Host позволяют к нему получить доступ.

Так что же такое WMI? Если говорить по простому, то WMI позволяет получить доступ практически ко всем элементам системы, вплоть до физического оборудования (процессы, службы, файловая система, сетевая карта, процессор, BIOS, материнская плата и многое другое). Больше того, с помощью Windows Management Instrumentation вы можете обрабатывать различные события WMI (была ли запущена некая программа, изменился ли объем диска или может в папке появились новые документы, и много, много чего еще). Заинтересовало? Надеюсь, что да. Естественно, что Windows Management Instrumentation позволяет работать не только локально, но и с удаленными системами, а иначе какое это администрирование.

И так, из чего же состоит WMI? К сожалению, из очень многих элементов, но не пугайтесь, я затрону лишь самые важные моменты. Начну, как говорится, по простому. Представьте себе огромное количество библиотек (свыше пяти тысяч), в каждой библиотеке описаны методы и свойства для работы с тем или иным элементом системы, в WMI эти библиотеки называются классами, классы обладают таким свойством как наследование, то есть, один класс (суперкласс) содержит в своем составе дочерние, которые могут полностью или частично наследовать методы и свойства суперкласса. Однако, держать весь этот арсенал в одном месте просто самоубийство, для того, что бы хоть как то распределить все классы по их функциональной схожести, в WMI существует такое понятие как пространство имен, своеобразные папки, пространства имен могут быть вложенными, главным является пространство root. Ниже я привел пример скрипта, который выводит список всех пространств имен, входящих в корневое пространство root. Не забудьте, что для работы скрипта требуется компонент WindowSystemObject и права администратора.

Давайте посмотрим на пример

'*********************************************
' Имя: names_list.vbs 
' Windows Management Instrumentation
' Просмотр всех пространств имен , нужны права администратора
'*********************************************
 
Option Explicit
On Error Resume Next
' Объявляем переменные 
Dim strComputer ' Имя компьютера 
Dim strResult ' Результат (текстовое сообщение) 
Dim strBeginNamespace ' Имя начального пространства имен 
Dim wso,f, MSG,t,ListBox,Button
 
'Создаем экземпляр объекта
set wso = CreateObject("Scripting.WindowSystemObject")
'Задаем начальные размеры и отступы
set f = wso.CreateForm(0,0,0,0)
'Задаем через свойства ширину и высоту
f.ClientWidth = 500
f.ClientHeight = 500
'Центрируем форму
f.CenterControl()
'Заголовок окна
f.Text = "Пространство имен"
'нельзя менять размеры
f.SizeGrip = false
'нельзя развернуть форму
f.MaximizeBox = false
 
MSG="Автор:Владимир Баталий" & vbCrLf &_
"Просмотр всех пространств имен," & vbCrLf &_ 
"начиная с корневого root, нужны права администратора "
set t = f.CreateHyperLink(10,10,250,20,"scriptcoding.ru")
f.TextOut 10,30,MSG
 
set Button = f.CreateButton(370,15,125,25,"Получить список")
 
'Компонент список
set ListBox = f.CreateListBox(5,70,490,400)
 
'Вызов функции GetNames после нажатия на кнопку
Button.OnClick = GetRef("GetNames")
 
'метод делает форму видимой
f.Show()
'Запуск встроенного цикла обработки сообщений, он будет продолжаться до тех пор, пока видна какая либо форма или до вызова метода Stop. 
wso.Run()
 
Sub GetNames(Sender)
    'Присваиваем начальные значения переменным 
    strComputer = "." 
    strResult = "" 
    strBeginNamespace = "Root"
    Call Namespaces(strBeginNameSpace)
    'Вызываем функцию для записи списка в файл
    Call write_data(strResult)
End Sub
 
'Рекурсивная функция для получения списка имен
Sub Namespaces (strNamespace) 
'Объявляем локальные переменные функции 
    Dim objService         ' Объект SWbemServices 
    Dim colNamespaces     ' Коллекция пространств имен WMI 
    Dim objNamespace     ' Элемент коллекции 
    ' Формируем результирующую строку 
    ListBox.Add(strNamespace)
    strResult = strResult & " " & strNamespace & VbCrLf 
    ' Подключаемся к пространству имен WMI 
    Set objService = GetObject("winmgmts:\\" & strComputer & "\" & strNamespace) 
    'Создаем коллекцию подпространств имен WMI 
    Set colNamespaces = objService.InstancesOf("__NAMESPACE") 
    'Перебираем коллекцию 
    For Each objNamespace In colNamespaces 
        'Для каждого элемента коллекции вызываем функцию Namespaces 
        Call Namespaces (strNamespace & "\" & objNamespace.Name) 
    Next 
 
End Sub
 
'Функция, отвечающая за запись списка в файл
Sub write_data(data)
    Dim FSO, Fl
    set FSO=CreateObject("Scripting.FileSystemObject")
    set    Fl=FSO.CreateTextFile("names_list.txt", true) 
    Fl.WriteLine(data)         
    Fl.Close()                
End Sub

Давайте разберем ключевые части скрипта, построчно:

Button.OnClick = GetRef(«GetNames») – после нажатия на кнопку будет происходить вызов функции GetNames с помощью обработчика GetRef (для языка Jscript все намного проще, вспомним пример из статьи Штурмуем протокол HTTP). В теле самой функции GetNames будет с помощью оператора call происходить вызов функции Namespaces с передачей ей начального пространства имен (Root). Функция write_data будет производить запись списка пространств имен WMI в текстовый файл, в качестве параметра передается переменная strResult.

Скачать архив с примерами

Теперь давайте поподробней разберем функцию Namespaces:

Строчка Set objService = GetObject(«winmgmts:\» & strComputer & «» & strNamespace) отвечает за подключение к пространству WMI с помощью моникера , как вы заметили, тут используется метод GetObject, а не CreateObject, как это было раньше. Переменная objService будет хранить теперь ссылку на объект SWbemServices (смотрим статью), который с помощью метода InstancesOf позволит получить коллекцию всех объектов для класса __NAMESPACE. Это системный класс (признаком есть двойное подчеркивание вначале) и позволяет получить доступ к пространству имен, у него есть свойство Name, которое хранит имя WMI пространства имен. Все имена в коллекции перебираются рекурсивно с помощью цикла For Each … In

Лады, с этим мы закончили. Так как функционал WMI (Windows Management Instrumentation) очень огромен, то я буду постепенно публиковать статьи с описаниями и различными (полезными) примерами. Пока вам стоит обязательно ознакомится со статьями Подключение к WMI с помощью моникера и Подключение к WMI с помощью объекта SWbemLocator.

Windows Management Instrumentation(WMI) – получаем список свойств, методов и квалификаторов

Забегая немного вперед, я написал небольшой скрипт на языке VBScript, который позволит получить список свойств, методов и квалификаторов (да, и с такими новинками вам придется познакомиться) для заданного класса Windows Management Instrumentation:

 '*********************************************
' Имя: class_info.vbs 
' Список свойств, методов и квалификаторов для заданного класса
'*********************************************
 
Option Explicit
On Error Resume Next
' Объявляем переменные 
Dim strComputer ' Имя компьютера 
Dim strResult ' Результат (текстовое сообщение) 
Dim strBeginNamespace ' Имя начального пространства имен 
Dim wso,f, MSG,t,ListBox,Button,class_edit, strClass
Dim BProperties, BMethods, BQualifiers
 
'Создаем экземпляр объекта
set wso = CreateObject("Scripting.WindowSystemObject")
'Задаем начальные размеры и отступы
set f = wso.CreateForm(0,0,0,0)
'Задаем через свойства ширину и высоту
f.ClientWidth = 500
f.ClientHeight = 500
'Центрируем форму
f.CenterControl()
'Заголовок окна
f.Text = "Пространство имен"
'нельзя менять размеры
f.SizeGrip = false
'нельзя развернуть форму
f.MaximizeBox = false
 
MSG="Автор:Владимир Баталий" & vbCrLf & vbCrLf &_ 
"Список свойств, методов и квалификаторов для заданного класса"
set t = f.CreateHyperLink(10,10,250,20,"scriptcoding.ru")
f.TextOut 10,30,MSG
 
'Компонент список
set ListBox = f.CreateListBox(5,70,350,430)
 
f.TextOut 360,70,"Имя класса"
'Поле для ввода имени класса
set class_edit = f.CreateEdit(360,90,135,20,wso.Translate("ES_MULTILINE"))
class_edit.Text="Win32_Process"
 
set BProperties = f.CreateButton(360,120,125,25,"Свойства")
set BMethods = f.CreateButton(360,150,125,25,"Методы")
set BQualifiers = f.CreateButton(360,180,125,25,"Квалификаторы")
 
'Вызов функций при нажатии на кнопки
BProperties.OnClick = GetRef("GetProperties")
BMethods.OnClick = GetRef("GetMethods")
BQualifiers.OnClick = GetRef("GetQualifiers")
 
f.Show()
wso.Run()
 
Sub GetProperties(Sender)    
    ListBox.Clear
    strResult = ""
    strComputer = "."  
    strBeginNamespace = "Root\CIMV2"
    strClass = class_edit.Text
    Call ListProperties(strComputer,strBeginNameSpace,strClass)
End Sub 
 
Sub GetMethods(Sender)
    ListBox.Clear
    strResult = ""
    strComputer = "."  
    strBeginNamespace = "Root\CIMV2"
    strClass = class_edit.Text
    Call ListMethods(strComputer,strBeginNameSpace,strClass)
End Sub
 
Sub GetQualifiers(Sender)
    ListBox.Clear    
    strResult = ""
    strComputer = "."  
    strBeginNamespace = "Root\CIMV2"
    strClass = class_edit.Text
    Call ListQualifiers(strComputer,strBeginNameSpace,strClass)
End Sub
 
'Функция вывода списка свойств
Sub ListProperties(NComputer,NBeginNameSpace,NClass) 
'Объявляем локальные переменные функции  
    Dim objService         ' Объект SWbemServices
    Dim colClassProperties     ' Коллекция свойств 
    Dim objClassProperty     ' Элемент коллекции 
 
    Set objService = GetObject("winmgmts:\\" & NComputer & "\" & NBeginNamespace & ":" & NClass)
    Set colClassProperties = objService.Properties_ 
    'Перебираем коллекцию 
    For Each objClassProperty In colClassProperties 
        strResult = strResult & objClassProperty.Name & VbCrLf
    ListBox.Add(objClassProperty.Name)
    Next  
    Call write_data(strResult,"Properties_List.txt")
End Sub
 
'Функция вывода списка методов
Sub ListMethods(NComputer,NBeginNameSpace,NClass) 
'Объявляем локальные переменные функции  
    Dim objService         ' Объект SWbemServices
    Dim colClassMethods     ' Коллекция свойств 
    Dim objClassMethods     ' Элемент коллекции 
 
    Set objService = GetObject("winmgmts:\\" & NComputer & "\" & NBeginNamespace & ":" & NClass)
    Set colClassMethods = objService.Methods_ 
    'Перебираем коллекцию 
    For Each objClassMethods In colClassMethods 
        strResult = strResult & objClassMethods.Name & VbCrLf
    ListBox.Add(objClassMethods.Name)
    Next  
    Call write_data(strResult,"Methods_List.txt")
End Sub
 
'Функция вывода списка квалификаторов
Sub ListQualifiers(NComputer,NBeginNameSpace,NClass) 
'Объявляем локальные переменные функции  
    Dim objService         ' Объект SWbemServices
    Dim colClassQualifiers     ' Коллекция свойств 
    Dim objClassQualifiers     ' Элемент коллекции 
 
    Set objService = GetObject("winmgmts:\\" & NComputer & "\" & NBeginNamespace & ":" & NClass)
    Set colClassQualifiers = objService.Qualifiers_ 
    'Перебираем коллекцию 
    For Each objClassQualifiers In colClassQualifiers 
        strResult = strResult & objClassQualifiers.Name & VbCrLf
    ListBox.Add(objClassQualifiers.Name)
    Next  
    Call write_data(strResult,"Qualifiers_List.txt")
End Sub
 
'Функция, отвечающая за запись списка в файл
Sub write_data(data,dfile)
    Dim FSO, Fl
    set FSO=CreateObject("Scripting.FileSystemObject")
    set    Fl=FSO.CreateTextFile(dfile, true) 
    Fl.WriteLine(data)         
    Fl.Close()                
End Sub

Хорошо, ждите новых статей и подписывайтесь на блог, что бы ничего не пропустить.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий