WMI故障排除
每个经验丰富的Windows管理员都面临WMI服务及其组件的一些问题。 WMI子系统中的问题对于系统的正常运行至关重要,管理员必须利用一些技巧来恢复WMI。在本文中,我们将介绍一种非常简单的WMI服务诊断和故障排除技术。
WMI出现问题可能表示各种错误:
- 系统和应用程序日志中WMI查询处理中的错误
- 与WMI相关的GPO错误(组策略中WMI筛选器的工作不正确,等等)
- 操作错误/无法安装SCCM/SCOM代理
- 使用WMI名称空间的脚本(VBS或者Powershell)中的错误
验证services.msc控制台中是否存在Winmgmt服务(Windows Management Instrumentation)。
如果winmgmt服务可用并且状态为"已启动",建议通过运行简单的WMI查询来测试WMI性能。使用Powershell,我们可以按照以下步骤进行操作:
get-wmiobject Win32_OperatingSystem
如果系统在运行简单的WMI查询后返回错误(在屏幕快照中是正确响应WMI服务的示例),WMI服务或者其某些子系统无法正常运行,则WMI存储库已损坏或者发生了其他一些问题。
WMIDiag实用程序
要执行WMI服务的详细诊断,请使用官方的Microsoft实用程序WMIDiag(Microsoft WMI诊断)。该实用程序是一个VBS脚本,用于检查不同的WMI子系统并将收集的信息写入日志文件(默认情况下,日志位于%TEMP%文件夹C:\USERS \%USERNAME%\ APPDATA\LOCAL\TEMP \中)。生成的报告包含名称以WMIDIAG-V2.1开头的文件,并包含以下文件类型:
- 日志文件包含WMIDiag活动的详细报告
- TXT文件包含值得关注的错误的最终报告
- CSV文件包含长期分析WMI子系统性能所需的信息
提示在Windows x64版本中,wmidiag应该如下运行:
c:\windows\System32\cscript.exe wmidiag.vbs
否则,将发生错误:WMIDiag必须在本机64位环境中运行。它在Wow64中。
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存储库。
" WMI存储库"位于%windir%\ System32\Wbem\Repository中,并且是一个数据库,其中包含有关元数据的信息和WMI类的描述。在某些情况下,WMI存储库还可以包含静态信息类。当存储库损坏时,WMI服务(Winmgmt)的活动中会发生错误,有时甚至无法运行它。
如果我们怀疑WMI存储库已损坏,请记住,只有在没有其他方法可以恢复WMI的情况下,才应重新创建它。
实际上,在某些情况下,WMI存储库的重建会导致第三方软件出现问题。原因是消除了所有WMI记录(达到了干净系统的状态)。此类软件可能必须在恢复模式下重新安装。
在Windows Vista或者更高版本中,可以使用以下命令检查存储库是否已损坏:
winmgmt /verifyrepository
如果命令返回WMI数据库处于不一致状态(INCONSISTENT),则应尝试对存储库进行软恢复:
Winmgmt /salvagerepository
并重新启动WMI:
net stop Winmgmt net start Winmgmt
如果上述命令没有帮助,请按以下方式将存储库重置为其初始状态(硬重置):
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_backup目录中)。脚本完成后,必须重新启动计算机,然后通过一个简单的请求测试WMI性能。