Я столкнулся с этой ситуацией на днях: мои студенты тестировали управление системными функциями и две машины в домене (на обеих – Windows 10) стали возвращать ошибки при работе с Windows Management Instrumentation. Основной админ ещё не вышел из отпуска, пришлось вспоминать, что я бывший руководитель Отдела ИТ
Сразу отвечу на третий вопрос: без рабочего WMI, на мой взгляд, можно оставлять лишь домашний игровой компьютер, на котором, кроме игр и просмотра видео, больше ничего не делается (разве что дети учатся программировать). В остальных случаях, особенно на корпоративных машинах, тем более в домене, WMI должна работать как часы. Это моё мнение, кто-то может не согласиться.
Теперь о причинах произошедшего: их может быть очень много. Забегая вперед, скажу что на одной машине это произошло из-за того, что на жестком диске закончилось место, а затем был сбой по питанию из-за сломанного ИБП (увы, никто не застрахован; сервера, конечно, защищены от подобного, а обычная рабочая машинка не была). На второй хуже: нефатальный сбой жесткого диска с последующим BSOD. В целом, разобраться с причинами не так уж и важно, главное, выяснить, что причиной не является вирус или попытка взлома. Впрочем, намеренное удаление или случайная порча системных файлов тоже должны быть рассмотрены достаточно пристально.
Восстановление работоспособности WMI следует проводить поэтапно, от щадящих методов к деструктивным. Следует быть готовым к тому, что в самом худшем случае систему придётся переустановить. Не стоит лишний раз напоминать, что большинство команд должно выполняться от имени администратора.
1 этап. Проверка работы сервиса.
Проверяем имеется ли в системе служба Windows Management Instrumentation (Winmgmt)
и включена ли она. Вызываем Службы (в Windows 10 проще всего через Пуск/Средства администрирования/Службы, но я предпочитаю в любой версии Windows, кроме самых старых, напечатать в командной строке services.msc
), ищем Инструментарий управления Windows/Windows Management Instrumentation
, проверяем, запущена ли она:
Если она не запущена, пытаемся запустить, выставим режим запуска в «Автоматически». Если запущена, пытаемся перезапустить (Остановить/запустить). После этого проверяем работоспособность WMI. Проще всего сделать это, выполнив любой WMI-запрос в powershell
(напоминаю, что powershell в Windows 10 запускается через Пуск/Windows PowerShell/Windows Power Shell, но проще, на мой взгляд, запустить командную строку с админовскими правами, а в ней уже набрать powershell
), например, такой: (вы можете выполнить другой, свой любимый :))
Get-WmiObject -List -ComputerName localhost
Если у вас вылетела портянка объектов, всё в порядке. Если же полезли ошибки, значит, работоспособность не восстановлена, переходим ко второму этапу.
Между делом скажу пару слов об официальной утилите Microsoft WMI Diagnosis. Все почему-то наперебой её рекомендуют, как хороший помощник при восстановлении. Увы, я убил достаточно много времени на анализ результатов действия этой утилиты: скрипт создал кучу лог-файлов, через которые продраться можно, если вы никуда не торопитесь, у вас есть куча времени и полкило пуэра/кофе-машина. В причинах сбоев я разобрался быстрее без неё. Вероятность того, что она может помочь непосредственно в скором восстановлении работы WMI – очень мала.
2 этап. Недеструктивное восстановление
Стоит попытаться вначале выполнить перерегистрацию библиотек и рекомпиляцию файлов расширения свойств объектов (Managed Object Format, MOF
) и языковую составляющую этих файлов (MFL
). Практически гарантированно сработает, если попытка WMI-запроса у вас вызывала ошибку вида “Ошибка в файле WMI.MOF” или любом другом MOF-файле. Для этого выполним следующие операции:
- Остановим службу WMI, обязательно запретив её автостарт
- Перерегистрируем все библиотеки в папке Windowssystem32wbem
- Перерегистрируем службы WMI и WMI Provider Host
- Запускаем службу WMI и разрешаем её автостарт
- Рекомпилируем MOF и MFL файлы
Можно собрать всё это в один BAT-файл и запустить:
# пункт 1
sc config winmgmt start= disabled
net stop winmgmt
# пункт 2
cd %windir%system32wbem
for /f %%s in ('dir /b *.dll') do regsvr32 /s %%s
#пункт 3
wmiprvse /regserver
winmgmt /regserver
#пункт 4
sc config winmgmt start= auto
net start winmgmt
#пункт 5
for /f %%s in ('dir /b *.mof') do mofcomp %%s
for /f %%s in ('dir /b *.mfl') do mofcomp %%s
Отмечу, что таким образом я восстановил работу WMI на первой машине. Со второй, увы не получилось. Если у вас не получается, пора переходить к 3му этапу
3 этап. Деструктивное восстановление
Фактически, на 3м этапе мы пересоздаем хранилище WMI, как таковое, которое находится в папке WindowsSystem32WbemRepository и является базой данных, в которой хранятся данные и определения стандартных WMI-классов и статическая информация дополнительных WMI-классов, если они создавались на вашей машине.
Перед операциями проверьте состояние жёсткого диска и файловой системы!!!
Проверяем целостность (На Windows XP и ниже не работает):
winmgmt /verifyrepository
В случае ответа отличного от “База данных WMI согласована”, можно выполнить «мягкое восстановление» командой:
winmgmt /salvagerepository
с последующим перезапуском службы:
net stop Winmgmt
net start Winmgmt
Если мягкое восстановление не помогло, пробуем вернуть хранилище в начальное состояние (последствия: все дополнительные классы WMI, когда-либо зарегистрированные в вашей системе, скорее всего, придётся регистрировать заново):
winmgmt /resetrepository
с последующим рестартом системы. Отмечу, что вторая машина заработала после этого этапа. Последствия были не сильно удручающими, но серьёзными: пришлось переинсталлировать Visual Studio и Delphi Starter, MS Office отказался работать и его пришлось деинсталлировать вручную, удаляя папки, файлы и записи из реестра, с последующей повторной установкой. Также слетели все наши собственные классы WMI.
Но, если и это не помогло, придётся удалять и создавать хранилище заново. Это можно сделать следующим BAT-файлом:
# Остановим службу WMI, обязательно запретив её автостарт
sc config winmgmt start= disabled
net stop winmgmt
# проводим реинициализацию WMI
cd %windir%system32wbem
winmgmt /kill
winmgmt /unregserver
winmgmt /regserver
winmgmt /resyncperf
# создаем на всякий случай резервную копию нашего хранилища в папку WMI_VicoNT_Backup
# у вас, разумеется, может быть другое имя папки
if exist WMI_VicoNT_Backup rd WMI_VicoNT_Backup /s /q
rename Repository Repos_bakup
# воссоздаем хранилище
regsvr32 /s %systemroot%system32scecli.dll
regsvr32 /s %systemroot%system32userenv.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
# запускаем службу WMI, заново регистрируем WMI Provider Host
sc config winmgmt start= auto
net start winmgmt
wmiprvse /regserver
Перегружаем компьютер. Если и после этих действий WMI не заработала, путь один – переустановка системы.
i started this trubleshoting
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.
C:Windowssystem32>Regsvr32 [/u] [/s] <OCX File Name>
The syntax of the command is incorrect.
C:Windowssystem32>RUN /N Regsvr32 /s MSMAPI32.OCX
‘RUN’ is not recognized as an internal or external command,
operable program or batch file.
C:Windowssystem32>CMD /K SC QC WINMGMT
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: WINMGMT
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:Windowssystem32svchost.exe -k netsvcs
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Windows Management Instrumentation
DEPENDENCIES : RPCSS
SERVICE_START_NAME : localSystem
C:Windowssystem32>net stop winmgmt
The following services are dependent on the Windows Management Instrumentation service.
Stopping the Windows Management Instrumentation service will also stop these services.
Security Center
Windows MultiPoint Server Repair Service
Windows MultiPoint Server Host Service
Hyper-V Virtual Machine Management
Do you want to continue this operation? (Y/N) [N]: y
The Security Center service is stopping.
The Security Center service was stopped successfully.
The Windows MultiPoint Server Repair Service service was stopped successfully.
The Windows MultiPoint Server Host Service service is stopping.
The Windows MultiPoint Server Host Service service was stopped successfully.
The Hyper-V Virtual Machine Management service is stopping……..
The Hyper-V Virtual Machine Management service could not be stopped.
System error 1051 has occurred.
A stop control has been sent to a service that other running services are dependent on.
C:Windowssystem32>net start winmgmt
The requested service has already been started.
More help is available by typing NET HELPMSG 2182.
C:Windowssystem32>winmgmt /salvagerepository
WMI repository verification failed
Error code: 0x80040154
Facility: Interface
Description: Class not registered
C:Windowssystem32>cd /d %windir%system32wbem
C:WindowsSystem32wbem>for %i in (*.dll) do RegSvr32 -s %i
C:WindowsSystem32wbem>RegSvr32 -s appbackgroundtask.dll
C:WindowsSystem32wbem>RegSvr32 -s cimwin32.dll
C:WindowsSystem32wbem>RegSvr32 -s DMWmiBridgeProv.dll
C:WindowsSystem32wbem>RegSvr32 -s dnsclientcim.dll
C:WindowsSystem32wbem>RegSvr32 -s dnsclientpsprovider.dll
C:WindowsSystem32wbem>RegSvr32 -s Dscpspluginwkr.dll
C:WindowsSystem32wbem>RegSvr32 -s dsprov.dll
C:WindowsSystem32wbem>RegSvr32 -s EmbeddedLockdownWmi.dll
C:WindowsSystem32wbem>RegSvr32 -s esscli.dll
C:WindowsSystem32wbem>RegSvr32 -s EventTracingManagement.dll
C:WindowsSystem32wbem>RegSvr32 -s fastprox.dll
C:WindowsSystem32wbem>RegSvr32 -s ipmiprr.dll
C:WindowsSystem32wbem>RegSvr32 -s ipmiprv.dll
C:WindowsSystem32wbem>RegSvr32 -s KrnlProv.dll
C:WindowsSystem32wbem>RegSvr32 -s MDMAppProv.dll
C:WindowsSystem32wbem>RegSvr32 -s MDMSettingsProv.dll
C:WindowsSystem32wbem>RegSvr32 -s MMFUtil.dll
C:WindowsSystem32wbem>RegSvr32 -s mofd.dll
C:WindowsSystem32wbem>RegSvr32 -s mofinstall.dll
C:WindowsSystem32wbem>RegSvr32 -s msdtcwmi.dll
C:WindowsSystem32wbem>RegSvr32 -s msiprov.dll
C:WindowsSystem32wbem>RegSvr32 -s NCProv.dll
C:WindowsSystem32wbem>RegSvr32 -s ndisimplatcim.dll
C:WindowsSystem32wbem>RegSvr32 -s NetAdapterCim.dll
C:WindowsSystem32wbem>RegSvr32 -s netdacim.dll
C:WindowsSystem32wbem>RegSvr32 -s NetEventPacketCapture.dll
C:WindowsSystem32wbem>RegSvr32 -s NetNat.dll
C:WindowsSystem32wbem>RegSvr32 -s netnccim.dll
C:WindowsSystem32wbem>RegSvr32 -s NetPeerDistCim.dll
C:WindowsSystem32wbem>RegSvr32 -s netswitchteamcim.dll
C:WindowsSystem32wbem>RegSvr32 -s NetTCPIP.dll
C:WindowsSystem32wbem>RegSvr32 -s netttcim.dll
C:WindowsSystem32wbem>RegSvr32 -s NetWNV.dll
C:WindowsSystem32wbem>RegSvr32 -s nlmcim.dll
C:WindowsSystem32wbem>RegSvr32 -s ntevt.dll
C:WindowsSystem32wbem>RegSvr32 -s PolicMan.dll
C:WindowsSystem32wbem>RegSvr32 -s PrintManagementProvider.dll
C:WindowsSystem32wbem>RegSvr32 -s qoswmi.dll
C:WindowsSystem32wbem>RegSvr32 -s RacWmiProv.dll
C:WindowsSystem32wbem>RegSvr32 -s repdrvfs.dll
C:WindowsSystem32wbem>RegSvr32 -s schedprov.dll
C:WindowsSystem32wbem>RegSvr32 -s ServDeps.dll
C:WindowsSystem32wbem>RegSvr32 -s smierrsm.dll
C:WindowsSystem32wbem>RegSvr32 -s smierrsy.dll
C:WindowsSystem32wbem>RegSvr32 -s smimsgif.dll
C:WindowsSystem32wbem>RegSvr32 -s SMTPCons.dll
C:WindowsSystem32wbem>RegSvr32 -s snmpcl.dll
C:WindowsSystem32wbem>RegSvr32 -s snmpincl.dll
C:WindowsSystem32wbem>RegSvr32 -s snmpsmir.dll
C:WindowsSystem32wbem>RegSvr32 -s snmpthrd.dll
C:WindowsSystem32wbem>RegSvr32 -s stdprov.dll
C:WindowsSystem32wbem>RegSvr32 -s vdswmi.dll
C:WindowsSystem32wbem>RegSvr32 -s viewprov.dll
C:WindowsSystem32wbem>RegSvr32 -s vpnclientpsprovider.dll
C:WindowsSystem32wbem>RegSvr32 -s vsswmi.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemcntl.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemcons.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemcore.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemdisp.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemess.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemprox.dll
C:WindowsSystem32wbem>RegSvr32 -s wbemsvc.dll
C:WindowsSystem32wbem>RegSvr32 -s WdacWmiProv.dll
C:WindowsSystem32wbem>RegSvr32 -s WEMSAL_WmiProvider.dll
C:WindowsSystem32wbem>RegSvr32 -s WESL_ShellLauncher.dll
C:WindowsSystem32wbem>RegSvr32 -s wfascim.dll
C:WindowsSystem32wbem>RegSvr32 -s Win32_EncryptableVolume.dll
C:WindowsSystem32wbem>RegSvr32 -s Win32_Tpm.dll
C:WindowsSystem32wbem>RegSvr32 -s WinMgmtR.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiApRes.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiApRpl.dll
C:WindowsSystem32wbem>RegSvr32 -s WMICOOKR.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiDcPrv.dll
C:WindowsSystem32wbem>RegSvr32 -s wmipcima.dll
C:WindowsSystem32wbem>RegSvr32 -s wmipdfs.dll
C:WindowsSystem32wbem>RegSvr32 -s wmipdskq.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiPerfClass.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiPerfInst.dll
C:WindowsSystem32wbem>RegSvr32 -s WMIPICMP.dll
C:WindowsSystem32wbem>RegSvr32 -s WMIPIPRT.dll
C:WindowsSystem32wbem>RegSvr32 -s WMIPJOBJ.dll
C:WindowsSystem32wbem>RegSvr32 -s wmiprov.dll
C:WindowsSystem32wbem>RegSvr32 -s WmiPrvSD.dll
C:WindowsSystem32wbem>RegSvr32 -s WMIPSESS.dll
C:WindowsSystem32wbem>RegSvr32 -s WMIsvc.dll
C:WindowsSystem32wbem>RegSvr32 -s wmitimep.dll
C:WindowsSystem32wbem>RegSvr32 -s wmiutils.dll
C:WindowsSystem32wbem>RegSvr32 -s WUAProvider.dll
C:WindowsSystem32wbem>for %i in (*.exe) do %i /RegServer
C:WindowsSystem32wbem>mofcomp.exe /RegServer
Microsoft (R) MOF Compiler Version 10.0.10586.0
Copyright (c) Microsoft Corp. 1997-2006. All rights reserved.
File ‘/RegServer’ not found!
C:WindowsSystem32wbem>scrcons.exe /RegServer
C:WindowsSystem32wbem>smi2smir.exe /RegServer
smi2smir.exe: No command argument specified, or unknown command argument
C:WindowsSystem32wbem>unsecapp.exe /RegServer
C:WindowsSystem32wbem>wbemtest.exe /RegServer
C:WindowsSystem32wbem>WinMgmt.exe /RegServer
Invalid parameter
Windows Management Instrumentation
Usage: winmgmt [/backup <filename>] [/restore <filename> <flag>]
[/resyncperf] [/standalonehost [<level>]] [/sharedhost]
[/verifyrepository [<path>]] [/salvagerepository]
[/resetrepository]
/backup <filename>
Causes WMI to back up the repository to the specified file name. The
filename argument should contain the full path to the file location.
This process requires a write lock on the repository so that write
operations to the repository are suspended until the backup process is
completed.
/restore <filename> <flag>
Manually restores the WMI repository from the specified backup file.
The filename argument should contain the full path to the backup file
location. To perform the restore operation, WMI saves the existing
repository to write back if the operation fails. Then the repository is
restored from the backup file that is specified in the filename
argument. If exclusive access to the repository cannot be achieved,
existing clients are disconnected from WMI. The flag argument must be a
1 (force — disconnect users and restore) or 0 (default — restore if no
users connected) and specifies the restore mode.
/resyncperf
Registers the system performance libraries with WMI.
/standalonehost [<level>]
Moves the Winmgmt service to a standalone Svchost process that has a
fixed DCOM endpoint. The default endpoint is «ncacn_ip_tcp.0.24158».
However, the endpoint may be changed by running Dcomcnfg.exe. The level
argument is the authentication level for the Svchost process. If level
is not specified, the default is 4 (RPC_C_AUTHN_LEVEL_PKT).
/sharedhost
Moves the Winmgmt service into the shared Svchost process.
/verifyrepository [<path>]
Performs a consistency check on the WMI repository. When you add the
/verifyrepository switch without the <path> argument, then the live
repository currently used by WMI is verified. When you specify the path
argument, you can verify any saved copy of the repository. In this
case, the path argument should contain the full path to the saved
repository copy. The saved repository should be a copy of the entire
repository folder.
/salvagerepository
Performs a consistency check on the WMI repository, and if an
inconsistency is detected, rebuilds the repository. The content of the
inconsistent repository is merged into the rebuilt repository, if it
can be read. The salvage operation always works with the repository
that the WMI service is currently using. MOF files that contain the
#pragma autorecover preprocessor statement are restored to the
repository.
/resetrepository
The repository is reset to the initial state when the operating system
is first installed. MOF files that contain the #pragma autorecover
preprocessor statement are restored to the repository.
C:WindowsSystem32wbem>WMIADAP.exe /RegServer
C:WindowsSystem32wbem>WmiApSrv.exe /RegServer
C:WindowsSystem32wbem>WMIC.exe /RegServer
Invalid Global Switch.
C:WindowsSystem32wbem>WmiPrvSE.exe /RegServer
C:WindowsSystem32wbem>ex
Любой бывалый Windows-админ периодически сталкивается с проблемами в работе службы WMI (Windows Management Instrumentation) и ее компонентах. Наличие проблем в подсистеме WMI является критичным с точки зрения нормального функционирования Windows, поэтому администратору необходимо проверить и восстановить работоспособность WMI. В этой статье мы опишем простую методику диагностирования и устранения неполадок службы WMI в Windows.
О наличии проблем с WMI может свидетельствовать широкий спектр ошибок:
- Ошибки обработки WMI запросов в системных журналах и логах приложений (
0x80041002 - WBEM_E_NOT_FOUND
,
WMI: Not Found
,
0x80041010 WBEM_E_INVALID_CLASS
); - Ошибки обработки GPO, связанные на WMI ( некорректная работа wmi фильтров групповых политик, и пр.);
- WMI запросы выполняются очень медленно;
- Ошибки при установке или работе агентов SCCM/SCOM;
- Ошибки в работе скриптов (vbs или PowerShell), использующих пространство имен WMI (скрипты с Get-WmiObject и т.д.).
Содержание:
- Диагностика проблем с WMI
- Исправление WMI репозитория, перерегистрация библиотек, перекомпиляция MOF файлов
- Сброс и пересоздание WMI репозитория (хранилища)
Диагностика проблем с WMI
В первую очередь нужно проверить служба Windows Management Instrumentation (Winmgmt) установлена в Windows и запущена. Вы можете проверить состояние службы в консоли services.msc или с помощью PowerShell:
Get-Service Winmgmt | Select DisplayName,Status,ServiceName
Если служба Winmgmt запущена, вы можете проверить работоспособность WMI, обратившись к ней с помощью простого WMI-запроса. Вы можете выполнить wmi запрос из командной строки или из PowerShell. Например, следующая команда выведет список установленных в Windows программ:
wmic product get name,version
Простейшая PowerShell команда для получения информации о версии и билда Windows 10 через WMI может выглядеть так:
get-wmiobject Win32_OperatingSystem
Как вы видите, служба WMI ответила на запрос корректно. Если при выполнении такого WMI-запроса Windows возвращает ошибку, скорее всего сервиса WMI работает некорректно, поврежден WMI репозиторий или есть какие-то другие проблемы.
В моем случае, например, при открытии свойств WMI Control в консоли управления компьютером (compmgmt.msc) появлялась надпись:
Failed to initialize all required WMI classes Win32_Processor. WMI: Invalid namespace Win32_WMISetting. WMI: Invalid namespace Win32_OperationSystem. WMI: Invalid namespace
Ранее для диагностики WMI существовала официальная утилита от Microsoft – WMIDiag.vbs (Microsoft WMI Diagnosis). WMIdiag это vbs скрипт, который проверяет различные подсистемы WMI и записывает собранную информацию в лог файлы (по умолчанию логи находятся в каталоге %TEMP% — C:USERS%USERNAME%APPDATALOCALTEMP). Получившийся отчет состоит из файлов, имена которых начинаются с WMIDIAG-V2.2 и включает в себя следующие типы фалов:
- .log файлы содержат подробный отчет об активности и работе утилиты WMIDiag;
- .txt файлы содержат итоговые отчеты о найденных ошибках, на которые стоит обратить внимание;
- В .csv файлах содержится информация, нужная для долгосрочного анализа работы подсистемы WMI.
Совет. В 64 битных версиях Windows wmidiag нужно запускать так:
c:windowsSystem32cscript.exe wmidiag.vbs
в противном случае появится ошибка:
WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.
После окончания работы утилиты WMIDiag администратор должен изучить полученные файлы логов, проанализировать и попытаться исправить найденные ошибки.
К сожалению, последняя версия WMIDiag 2.2 корректно работает только с версиями до Windows 8.1/Windows Server 2012 R2. На данный момент Microsoft даже удалила ссылку на загрузку WMIDiag из Download Center. Но при желании, этот скрипт можно найти в сети.
WMIDiag может дать подробную информацию по исправлению частных ошибок в WMI, но в большинстве случаев процесс это довольно трудоемкий и стоит потраченного времени только при решении инцидентов в критичных системах (как правило, на продуктивных серверах). Для массового сегмента рабочих станций пользователей сбросить и пересоздатьWMI репозиторий в Windows.
Исправление WMI репозитория, перерегистрация библиотек, перекомпиляция MOF файлов
В Windows 10/Windows Server 2016 вы можете проверить целостность репозитория WMI с помощью команды:
winmgmt /verifyrepository
Если команда возвращает, что база данных WMI находится в неконсистентном состоянии (INCONSISTENT или WMI repository verification failed), стоит попробовать выполнить “мягкое” исправление ошибок репозитория:
Winmgmt /salvagerepository
WMI repository has been salvaged.
Данная команда выполняет проверку согласованности хранилища WMI и при обнаружении несогласованности перестраивает базу данных WMI.
Перезапустите службу WMI:
net stop Winmgmt
net start Winmgmt
Если стандартный способ исправления ошибок в WMI не помог, попробуйте следующий скрипт. Данный скрипт представляет собой ”мягкий” вариант восстановления службы WMI на компьютере (выполняется перерегистрация dll библиотек и службы WMI, перекомпилируются mof файлы). Данная процедура является безопасной и ее выполнение не должно привести к каким-либо новым проблемам с системой.
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%system32wbem
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
wmiprvse /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
На 64 битной версии Windows эти действия нужно также выполнить для каталога SysWOW64. Замените третью строку на
cd %windir%SysWOW64wbem
Указанные команды можно выполнить путем простой вставки в окно командой строки, либо сохранить код в bat файле wmi_soft_repair.bat и запустить его с правами администратора. После окончания работы скрипта, перезагрузите Windows и проверьте работу WMI.
Сброс и пересоздание WMI репозитория (хранилища)
Если вам не помогли мягкие способ восстановления WMI, рассмотренные выше, придется перейти к более “жесткому” способу восстановления работоспособности службы WMI, заключающегося в пересоздании хранилищаWMI.
WMI репозиторий (хранилище) находится в каталоге
%windir%System32WbemRepository
и представляет собой базу данных, в которой содержится информация о метаданных и определениях WMI классов. В некоторых случаях WMI репозиторий может содержать статическую информацию классов. При повреждении репозитория WMI, в работе службы Windows Management Instrumentation (Winmgmt) могут наблюдаться ошибки вплоть до полной невозможности ее запустить.
Если вы подозреваете, что репозиторий WMI поврежден, имейте в виду, что его пересоздание — это последняя шаг, к которому нужно прибегнуть только тогда, когда другие операции не помогают реанимировать WMI.
Следующая команда выполнит сброс базы данных WMI к исходному состоянию (как после чистой установки Windows). Используйте эту команду для выполнения hard reset репозитория WMI, если параметре salvagerepository не исправил проблему:
Winmgmt /resetrepository
Совет. На практике бывают случаи, когда пересоздание хранилища WMI приводит к проблемам со сторонним софтом. Это связано с тем, что все записи в базе WMI обнуляются (до состояния чистой системы). Такие программы скорее всего, придется переустанавливать в режиме восстановления.
Если обе команды (
Winmgmt /salvagerepository
и
Winmgmt /resetrepository
) не восстановили консистентное состояние базы WMI, попробуйте выполнить “жесткое” пересоздание базы WMI вручную таким скриптом:
sc config winmgmt start= disabled
net stop winmgmt
cd %windir%system32wbem
winmgmt /resetrepository
winmgmt /resyncperf
if exist Repos_bakup rd Repos_bakup /s /q
rename Repository Repos_bakup
regsvr32 /s %systemroot%system32scecli.dll
regsvr32 /s %systemroot%system32userenv.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
На 64 битной версии Windows нужно также перерегистрировать dll/exe и перекомпилировать mof файлы в каталоге %windir%sysWOW64wbem.
Данный скрипт полностью пересоздает хранилище WMI (старый репозиторий сохраняется в каталог Repos_bakup). После окончания работы скрипта нужно перезагрузить Windows. Затем протестируйте работу службы WMI простым запросом.
Проверьте состояние WMI репозитория. Если ошибки исправлены, команда
winmgmt /verifyrepository
должна вернуть:
WMI repository is consistent
В этой статье мы собрали основные способы, позволяющие продиагностировать и устранить неполадки службы и репозитория WMI.
The thing called Windows Management Instrumentation or WMI comes installed on each modern operating system of Microsoft, including Windows 2000, Windows XP, Windows 2003, Windows Vista, and Windows 2008. If you want to enable the remote access to WMI, here are the steps that you can follow.
- Enable remote WMI requests
To get WMI working, this setting is usually all that you need to change. First of all, go to Administrative Tools > Computer Management in the target server. Then, expand Service and Applications. The next thing that you will have to do is to right click for Properties on WMI Control. After that, choose the Security tab. The fifth step is to press the Security button. Lastly, add the monitoring user if needed, and then make sure to check Remote Enable for the user or group that will be requesting the WMI data. When everything is done, go back and see if the issue is fixed. The process of reporting to re-generating might takes a couple of minutes so please be patient.
- Allow WMI via Windows firewall
Each user, including non-administrators, is able to read or query WMI data on the local computer. a connection has to be made from the management computer where the monitoring software is installed for reading WMI data on a remote server to the server that you are monitoring or the target of the server. If the target server is running Windows Firewall or Internet Connection Firewall just like that one shipped with Windows XP and Windows 2003, then you have to tell it to allow remote WMI requests. This one is able to only be done at the Command Prompt. Please run the following on the target computer if it is running a Windows firewall:
netsh firewall set service RemoteAdmin enable
- Enable DCOM calls on the remote machine
In case the account that you are using to monitor the target server is not an administrator on the target server, you will have to enable the non-administrator in order to interact with DCOM by performing the simple instructions listed here . You should follow the steps to grant DCOM remote launch and activation permissions for a user or group and to grant DCOM remote access permissions.
In case no one of the things above did not help you, you are recommended to install the WMI Administrative Tools from Microsoft. This one includes a WMI browser that will allow you to connect to a remote machine and browse through the WMI information. It is so good to isolate any connectivity or rights issues in a more direct and simple environment. Once the WMI browser is able to access a remote machine, the products should be able to as well.
There are a lot of kinds of WMI Administrative Tools. One of them is called PowerShell. PowerShell is the name of the command line interface that was designed by Microsoft to help it to complete against the operating system such as Unix and Linux. This one has gathered a lot of features that have turned Linux and Unix to be such excellent operating systems. Until now, it has been able to be a stable and simple program to learn the interface that offers you much more than just WMI controls. However, it does not mean that PowerShell does not have great functionality with WMI.
There are tons of commands that are able to be built around the WMI interactions from within the thing called PowerShell, however the most important thing is scripting all the functions successfully. For those system administrators, you may already know about the ability that comes from using PowerShell in scripts and batch files. On the other hands, for those who have never heard of it before, now it is time for you to learn more about how to use it and what it is for. PowerShell is free and you can download it here https://msdn.microsoft.com/en-us/powershell/.
The second recommended tool is named WMIE or Windows Management Instrumentation Explorer. This one is an amazing project that has been developed with the purpose of providing you with a single viewing pane that shows up information such as WMI Namespaces, Classes, Instance and Properties which all of them are related to a clean interface. The main inspiration for the design of this app was to make browsing WMI data more accessible and more easy to use, as well as maintaining the high levels of functionality and usefulness. If you want to successfully run it, you need to make sure that you have the full version of the Microsoft .NET Framework 4.0 installed on the target system that you want to run it from. Actually, you can also install .NET Framework 4.5.1. The good news is, WMIE is free and you are able to download it on here: https://wmie.codeplex.com/.
There are some interesting features of WMIE, those include method execution, browse and view WMI objects in a single pane of view, Asynchronous and Synchronous mode for enumeration, connect as alternate credentials to remote computers, filter classes and instances matching certain criteria, and SMS mode providing supporting functionality for Configuration Manager.
There is also WMIX Free WMI Tools that allows you to do Windows administration tasks remotely without agents, which is what WMI enables you to do. It is really different compared to directly using WMI tools that you have to understand how to script or how to interpret vast amounts of data. It extracts and shows up all of this data for you in an easy to use window. After you have made your query, it allows you to export the command that underpins the query to well-known formats such as Visual Basic WMI Scripts or PowerShell. On the other words, once the hard work has been done by the application, you are able to simply extract the commands that you need and then integrate everything into the scripting or programs.
AUTHOR BIO
On my daily job, I am a software engineer, programmer & computer technician. My passion is assembling PC hardware, studying Operating System and all things related to computers technology. I also love to make short films for YouTube as a producer. More at about me…
Любой бывалый 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%APPDATALOCALTEMP). Получившийся отчет состоит из файлов, имена которых начинаются с WMIDIAG-V2.1 и включает в себя следующие типы фалов :
- .log файлы содержат подробный отчет об активности и работе утилиты WMIDiag
- .txt файлы содержат итоговые отчеты о найденных ошибках, на которые стоит обратить внимание
- В .csv файлах содержится информация, нужная для долгосрочного анализа работы подсистемы WMI
Совет. В 64 битных версиях Windows wmidiag нужно запускать так:
c:windowsSystem32cscript.exe wmidiag.vbs
в противном случае появится ошибка: WMIDiag must be run from native 64-bit environment. It is not supported in Wow64.
После окончания работы утилиты WMIDiag администратор должен изучить полученные файлы логов, проанализировать и попытаться исправить найденные ошибки.
В общем случае, WMIDiag может дать информацию по исправлению частных ошибок в WMI , но в большинстве случаев процесс это довольно трудоемкий и стоит потраченного времени только при решении инцидентов в критичных системах (как правило, на продуктивных серверах). Для массового сегмента рабочих станций пользователей гораздо проще «бить по площадям» и решать проблему работы WMI более радикально.
Перерегистрация библиотек WMI и перекомпиляция mof файлов
Следующий скрипт представляет собой «мягкий» вариант восстановления работоспособности службы WMI на отдельно взятом компьютере (выполняется перерегистрация dll библиотек и службы WMI, перекомпилируются mof файлы). Данная процедура является безопасной и ее выполнение не должно привести к каким-либо новым проблемам с системой.
sc config winmgmt start= disabled net stop winmgmt cd %windir%system32wbem 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 репозиторий (хранилище) находится в каталоге %windir%System32WbemRepository и представляет собой базу данных, в которой содержится информация о метаданных и определениях WMI классов. В некоторых случаях репозитория WMI может содержать статическую информацию классов. При повреждении репозитория WMI, в работе службы Windows Management Instrumentation (Winmgmt) могут наблюдаться ошибки вплоть до полной невозможности ее запустить.
В том случае, если вы подозреваете, что репозиторий WMI поврежден, имейте в виду, что его пересоздание это последняя вещь, к которой нужно прибегнуть только в том случае, если никакие другие операции реанимировать WMI не помогают.
Совет. На практике бывают случаи, когда пересоздание хранилища WMI приводит к проблемам со сторонним софтом. Вызван этот эффект тем, что все записи в базе WMI обнуляются (до состояния чистой системы). Такое ПО, вероятно, придется переустанавливать в режиме восстановления.
В Windows Vista и выше проверить целостность репозитория WMI можно с помощью команды:
winmgmt /verifyrepository
Если команда возвращает, что база данных WMI находится в неконсистентном состоянии (INCONSISTENT), стоит попробовать выполнить «мягкое» восстановление репозитория:
Winmgmt /salvagerepository
И перезапустить службу wmi:
net stop Winmgmt
net start Winmgmt
Если описанная выше команда не помогла, выполняем сброс репозитория на начальное состояние (hard reset) так:
Winmgmt /resetrepository
В том случае, если команды Winmgmt /salvagerepository и Winmgmt /resetrepository желаемого эффекта не дали, стоит попробовать выполнить «жесткое» пересоздание базы WMI вручную таким сценарием:
sc config winmgmt start= disabled net stop winmgmt cd %windir%system32wbem winmgmt /kill winmgmt /unregserver winmgmt /regserver winmgmt /resyncperf if exist Repos_bakup rd Repos_bakup /s /q rename Repository Repos_bakup regsvr32 /s %systemroot%system32scecli.dll regsvr32 /s %systemroot%system32userenv.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 простым запросом.