Знакомство с 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' Просмотр всех пространств имен , нужны права администратора'********************************************* OptionExplicitOnErrorResumeNext' Объявляем переменные 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 = 500f.ClientHeight = 500'Центрируем формуf.CenterControl()'Заголовок окнаf.Text = "Пространство имен"'нельзя менять размерыf.SizeGrip = false'нельзя развернуть формуf.MaximizeBox = false MSG="Автор:Владимир Баталий" & vbCrLf &_"Просмотр всех пространств имен," & vbCrLf &_ "начиная с корневого root, нужны права администратора "set t = f.CreateHyperLink(10,10,250,20,"www.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)EndSub 'Рекурсивная функция для получения списка имен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")     'Перебираем коллекцию     ForEach objNamespace In colNamespaces         'Для каждого элемента коллекции вызываем функцию Namespaces         Call Namespaces (strNamespace & "" & objNamespace.Name)     Next  EndSub 'Функция, отвечающая за запись списка в файл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()                EndSub

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

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 ' Список свойств, методов и квалификаторов для заданного класса'********************************************* OptionExplicitOnErrorResumeNext' Объявляем переменные Dim strComputer ' Имя компьютера Dim strResult ' Результат (текстовое сообщение) Dim strBeginNamespace ' Имя начального пространства имен Dim wso,f, MSG,t,ListBox,Button,class_edit, strClassDim BProperties, BMethods, BQualifiers 'Создаем экземпляр объектаset wso = CreateObject("Scripting.WindowSystemObject")'Задаем начальные размеры и отступыset f = wso.CreateForm(0,0,0,0)'Задаем через свойства ширину и высотуf.ClientWidth = 500f.ClientHeight = 500'Центрируем формуf.CenterControl()'Заголовок окнаf.Text = "Пространство имен"'нельзя менять размерыf.SizeGrip = false'нельзя развернуть формуf.MaximizeBox = false MSG="Автор:Владимир Баталий" & vbCrLf & vbCrLf &_ "Список свойств, методов и квалификаторов для заданного класса"set t = f.CreateHyperLink(10,10,250,20,"www.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 = "RootCIMV2"    strClass = class_edit.Text    Call ListProperties(strComputer,strBeginNameSpace,strClass)EndSub  Sub GetMethods(Sender)    ListBox.Clear    strResult = ""    strComputer = "."      strBeginNamespace = "RootCIMV2"    strClass = class_edit.Text    Call ListMethods(strComputer,strBeginNameSpace,strClass)EndSub Sub GetQualifiers(Sender)    ListBox.Clear        strResult = ""    strComputer = "."      strBeginNamespace = "RootCIMV2"    strClass = class_edit.Text    Call ListQualifiers(strComputer,strBeginNameSpace,strClass)EndSub 'Функция вывода списка свойствSub ListProperties(NComputer,NBeginNameSpace,NClass) 'Объявляем локальные переменные функции      Dim objService         ' Объект SWbemServices    Dim colClassProperties     ' Коллекция свойств     Dim objClassProperty     ' Элемент коллекции      Set objService = GetObject("winmgmts:\" & NComputer & "" & NBeginNamespace & ":" & NClass)    Set colClassProperties = objService.Properties_     'Перебираем коллекцию     ForEach objClassProperty In colClassProperties         strResult = strResult & objClassProperty.Name & VbCrLf    ListBox.Add(objClassProperty.Name)    Next      Call write_data(strResult,"Properties_List.txt")EndSub 'Функция вывода списка методовSub ListMethods(NComputer,NBeginNameSpace,NClass) 'Объявляем локальные переменные функции      Dim objService         ' Объект SWbemServices    Dim colClassMethods     ' Коллекция свойств     Dim objClassMethods     ' Элемент коллекции      Set objService = GetObject("winmgmts:\" & NComputer & "" & NBeginNamespace & ":" & NClass)    Set colClassMethods = objService.Methods_     'Перебираем коллекцию     ForEach objClassMethods In colClassMethods         strResult = strResult & objClassMethods.Name & VbCrLf    ListBox.Add(objClassMethods.Name)    Next      Call write_data(strResult,"Methods_List.txt")EndSub 'Функция вывода списка квалификаторовSub ListQualifiers(NComputer,NBeginNameSpace,NClass) 'Объявляем локальные переменные функции      Dim objService         ' Объект SWbemServices    Dim colClassQualifiers     ' Коллекция свойств     Dim objClassQualifiers     ' Элемент коллекции      Set objService = GetObject("winmgmts:\" & NComputer & "" & NBeginNamespace & ":" & NClass)    Set colClassQualifiers = objService.Qualifiers_     'Перебираем коллекцию     ForEach objClassQualifiers In colClassQualifiers         strResult = strResult & objClassQualifiers.Name & VbCrLf    ListBox.Add(objClassQualifiers.Name)    Next      Call write_data(strResult,"Qualifiers_List.txt")EndSub 'Функция, отвечающая за запись списка в файлSub write_data(data,dfile)    Dim FSO, Fl    set FSO=CreateObject("Scripting.FileSystemObject")    set    Fl=FSO.CreateTextFile(dfile, true)     Fl.WriteLine(data)             Fl.Close()                EndSub

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

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