WMI故障排除

时间:2020-01-09 10:47:05  来源:igfitidea点击:

每个经验丰富的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性能。