Windows management instrumentation

Устранение неполадок в WMI

Windows management instrumentation

Любой бывалый Windows-админ не раз сталкивался с проблемами в работе службы WMI и ее компонентах.

Наличие проблем в подсистеме WMI является критичным с точки зрения нормального функционирования системы, поэтому администратору приходится прибегать к тем или иным трюкам, позволяющим восстановить работоспособность WMI.  В этой статье мы опишем достаточно простую методику диагностирования и устранения неполадок в службе WMI.

О наличии проблем с WMI может свидетельствовать широкий спектр ошибок:

  • Ошибки обработки WMI запросов в системных журналах и логах приложений
  • Ошибки GPO, завязанные на WMI ( некорректная работа wmi фильтров политик, и пр.)
  • Ошибки в работе / невозможность установки агентов SCCM/SCOM
  • Ошибки в работе скриптов (vbs или powershell), использующих пространство имен WMI

В первую очередь нужно проверить имеется ли в системе служба Windows Management Instrumentation (Winmgmt) и включена ли она.

Если служба  присутствует и находится в состоянии Started, рекомендуется протестировать работоспособность WMI, обратившись к ней с помощью простого wmi-запроса. С помощью Powershell, например, это можно сделать так:

get-wmiobject Win32_OperatingSystem

Если при выполнении простейшего WMI-запроса система возвращает ошибку (на скриншоте приведен пример корректного ответа службы WMI), вероятно имеет место некорректное функционирование сервиса WMI или ряда его подсистем, повреждение репозитория WMI или другие проблемы.

Утилита WMIDiag

Для «тонкой» диагностики службы WMI существует официальная утилита Microsoft — WMIDiag (Microsoft WMI Diagnosis).

Утилита представляет собой vbs скрипт, который проверяет различные подсистемы WMI и записывает собранную информацию в лог файлы (по умолчанию логи находятся в каталоге %TEMP% — C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\).

Получившийся отчет состоит из файлов, имена которых начинаются с WMIDIAG-V2.1 и включает в себя следующие типы фалов :

  • .log файлы содержат подробный отчет об активности и работе утилиты WMIDiag
  • .txt файлы содержат итоговые отчеты о найденных ошибках, на которые стоит обратить внимание
  • В .csv файлах содержится информация, нужная для долгосрочного анализа работы подсистемы WMI

После окончания работы утилиты WMIDiag администратор должен изучить полученные файлы логов, проанализировать и попытаться исправить найденные ошибки.

В общем случае, WMIDiag может дать информацию по исправлению частных ошибок в WMI , но в большинстве случаев процесс это довольно трудоемкий и стоит потраченного времени только при решении инцидентов в критичных системах (как правило, на продуктивных серверах). Для массового сегмента рабочих станций пользователей гораздо проще «бить по площадям» и решать проблему работы WMI более радикально.

Перерегистрация библиотек WMI и перекомпиляция mof файлов

Следующий скрипт представляет собой «мягкий» вариант восстановления работоспособности службы WMI на отдельно взятом компьютере (выполняется перерегистрация dll библиотек и службы WMI, перекомпилируются mof файлы). Данная процедура является безопасной и ее выполнение не должно привести к каким-либо новым проблемам с системой.

sc config winmgmt start= disabled net stop winmgmt cd %windir%\system32\wbem for /f %%s in ('dir /b *.dll') do regsvr32 /s %%s wmiprvse /regserver winmgmt /regserver sc config winmgmt start= auto net start winmgmt for /f %%s in ('dir /b *.mof') do mofcomp %%s for /f %%s in ('dir /b *.mfl') do mofcomp %%s

Указанные команды можно выполнить путем простой вставки в окно командой строки, либо сохранить код в bat файле и запустить его с правами администратора. После окончания работы скрипта, систему нужно перезагрузить и вновь проверить работу WMI.

Пересоздание репозитория (хранилища) WMI

В том случае, если предыдущий способ не помог, придется перейти к более «жесткому» способу восстановления работоспособности службы WMI, заключающегося в пересоздании хранилища.

WMI репозиторий (хранилище) находится в каталоге %windir%\System32\Wbem\Repository и представляет собой базу данных, в которой содержится информация о метаданных и определениях WMI классов.

В некоторых случаях репозитория WMI может содержать статическую информацию классов.

При повреждении репозитория WMI,  в работе службы Windows Management Instrumentation (Winmgmt) могут наблюдаться ошибки вплоть до полной невозможности ее запустить.

В том случае, если вы подозреваете, что репозиторий WMI поврежден, имейте в виду, что его пересоздание это последняя вещь, к которой нужно прибегнуть только в том случае, если никакие другие операции реанимировать WMI не помогают.

В Windows Vista и выше проверить целостность репозитория WMI  можно с помощью команды:

winmgmt /verifyrepository

Если команда возвращает, что база данных WMI находится в неконсистентном состоянии (INCONSISTENT), стоит попробовать выполнить «мягкое» восстановление репозитория:

Winmgmt /salvagerepository

И перезапустить службу wmi:

net stop Winmgmtnet start WinmgmtЕсли описанная выше команда не помогла, выполняем сброс репозитория на начальное состояние (hard reset) так:
Winmgmt /resetrepository

В том случае, если команды Winmgmt /salvagerepository и Winmgmt /resetrepository желаемого эффекта не дали, стоит попробовать выполнить «жесткое» пересоздание базы WMI вручную таким сценарием:

sc config winmgmt start= disabled net stop winmgmt cd %windir%\system32\wbem winmgmt /kill winmgmt /unregserver winmgmt /regserver winmgmt /resyncperf if exist Repos_bakup rd Repos_bakup /s /q rename Repository Repos_bakup regsvr32 /s %systemroot%\system32\scecli.dll regsvr32 /s %systemroot%\system32\userenv.dll for /f %%s in ('dir /b *.dll') do regsvr32 /s %%s for /f %%s in ('dir /b *.mof') do mofcomp %%s for /f %%s in ('dir /b *.mfl') do mofcomp %%s sc config winmgmt start= auto net start winmgmt wmiprvse /regserver

Данный скрипт полностью пересоздает хранилище WMI (старый репозитория сохраняется в каталоге Repos_bakup). После окончания работы скрипта компьютер нужно перезагрузить, после чего протестировать работу службы WMI простым запросом.

В этой статье мы собрали типовые методики позволяющие устранить неполадки в работе службы WMI и ее подсистемах.

Источник: https://winitpro.ru/index.php/2014/08/12/ustranenie-nepoladok-v-wmi/

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

Windows management instrumentation

Приветствую всех читателей моего блога, подписчиков, гостей и просто случайных прохожих, настало время познакомить вас с таким полезным и мощным инструментом администрирования как 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 ExplicitOn 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 = 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)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 ExplicitOn Error Resume Next' Объявляем переменные 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 = “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

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

Источник: http://scriptcoding.ru/2013/04/12/windows-management-instrumentation/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.