1

我有一个脚本,它遍历 Active Directory OU 中的所有工作站,并从每台机器中提取软件数据。

我找到了两个给我这个数据的类:

Win32_Product
Win32_InstalledWin32Program

后者是更完整的列表,因为据我了解,Win32_Product仅显示通过 Windows 安装程序安装的应用程序,尽管后者不包含 InstallDate 属性。拥有一个 InstallDate 不如拥有一个完整列表那么重要,所以我一直在合并我的两个GWMI命令的输出,并使用Sort-Object -Property Name -Unique它来接近我正在寻找的内容。 编辑:了解到查询 Win32_Product 会触发它查询的每个软件的一致性检查,如果发现错误可能会重新安装程序。将完全取消 Win32_Product,并感谢任何神力,我没有重新安装一些关键的生产工具。 https://support.microsoft.com/en-ca/help/974524/event-log-message-indicates-that-the-windows-installer-reconfigured-al

无论出于何种原因,该Win32_InstalledWin32Program课程在某些计算机上不可用,并且出现Get-WMIObject : Invalid Class错误。在检查了Get-WMIObject几台有问题的机器后,我可以确认我想要的课程不可用。为什么会出现这种情况,有没有办法让我可以使用它?我在文档中找不到有关依赖项的任何内容。所有机器都运行 Windows 7,请参见下面的屏幕截图。

      $winProduct = GWMI Win32_Product -ComputerName $computer | Select-Object Name,Vendor,Version,InstallDate
      # vvv This fails on certain machines.
      $winPrograms = GWMI Win32_InstalledWin32Program -ComputerName $computer| Select-Object Name, Vendor, Version, InstallDate
      $winProduct + $winPrograms | Sort-Object -Property Name -Unique | export-csv -path $targetSWfile -notype

程序查询比较 OSQuery 比较

4

2 回答 2

0

Win32_InstalledWin32Program 类由文件提供aeinv.mof。此文件可能已损坏或丢失。

WMI 存储库位于此处:C:\Windows\System32\wbem

解决此问题的一种方法是从类工作正常的设备复制文件并覆盖有问题设备的 wmi 存储库中的文件。随后,您需要重新启动 WinMgmt 服务。

有关详细信息,请参阅此处的类定义:https ://msdn.microsoft.com/en-us/library/dn894026(v=vs.85).aspx

在企业环境中,这将是相对不合适的,人们会假设您还会让 SCCM 捕获库存数据。在企业中,更适合远离这些面向对等的任务执行,并执行管理服务器驱动的任务,例如来自 SCCM 或其他一些中央管理的程序。您如何在企业中大规模处理它归结为您实际尝试解决的问题。

还有其他检索软件清单的机制,我将探索它而不是尝试使用 Win32_Product 或 Win32_InstalledWin32Program 类进行查询,因为这些是密集的并且依赖于客户端在执行时在线。

于 2018-06-21T02:20:08.713 回答
0

此恢复 wmi 代码,从管理员或系统帐户执行:

net stop winmgmt
cd %windir%\system32\wbem
if exist Repos_backup rd Repos_backup /s /q
rename Repository Repos_backup
net start winmgmt
winmgmt /resetrepository
winmgmt /salvagerepository
winmgmt /resyncperf
regsvr32 /s %systemroot%\System32\scecli.dll
regsvr32 /s %systemroot%\System32\userenv.dll
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.dll') do regsvr32 /s %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.exe') do regsvr32 /s %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.mfl') do mofcomp %%s
for /f %%s in ('dir /b /s %windir%\System32\wbem\*.mof') do mofcomp %%s
wmiprvse /regserver
cd %windir%
if exist CCM rd CCM /s /q
if exist ccmcache rd ccmcache /s /q
if exist ccmsetup rd ccmsetup /s /q
if exist SMS*.INI del SMS*.INI /s /q
if exist SMS*.mif del SMS*.mif /s /q
cd %windir%\System32
if exist CCM rd CCM /s /q
if exist ccmcache rd ccmcache /s /q
if exist ccmsetup rd ccmsetup /s /q 
于 2018-06-21T08:34:31.097 回答