4

之前已经讨论过如何查询安装在Windows系统上的修复程序列表,建议使用WMI和类Win32_QuickFixEngineering来提供信息。但是MSDN指出,从 Vista 开始,这个特定的类只返回修补程序,而不是通过其他方式安装的更新。

一个较早的问题讨论了使用此类来获取已安装的更新,表明由于我上面描述的限制,作者也不满意使用它。不幸的是,正如对已接受答案的评论所指出的那样,使用 Windows 更新代理 API 的替代解决方案仍会指示已安装修补程序,即使它随后被删除(它正在查询安装历史记录,而不是当前安装的更新) .

有谁知道如何在 C#(通过 WMI 或其他 API)中获取系统上安装的更新和修补程序的完整列表,这不排除可能安装更新的某些方式,并且不会返回已安装的更新随后被删除?本质上,我在“查看已安装的更新”窗格下的“程序和功能”中使用相同的数据集。

抱歉,如果本应就之前查看此问题的任何一个相关问题进行讨论,但以我目前的声誉,我可以为这两个问题做出贡献的唯一方法是提交一个新的答案,这绝对不是正确的方法再问一个诸如此类的问题。

谢谢!

4

2 回答 2

0

据我所知,任何已安装和能够卸载的东西都必须在注册表中注册,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 似乎子项名称 KB999999 是为系统更新(修补程序或服务包)保留的。更新的内容将在名为 ParentKeyName 的子项中具有 REG_SZ 值,该值链接到它更新的注册表项。

例如,我有 SQL Server 2008 的 Service Pack 1,所以我HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369在注册表中有一个子项。它有一个名为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369\ParentKeyName“Microsoft SQL Server 10 Release”的 REG_SZ 值。因为我安装了 SQL Server 2008(因为 KB968369 是它的 SP),所以我还有一个HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 10 ReleaseParentKeyName 链接。

您可以从 ReleaseType REG_SZ 值判断更新的类型。例如,KB968369 安装的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369\ReleaseType值为“ServicePack”

我假设只有可以卸载的更新在Uninstall密钥下注册。还有似乎详细说明各种系统更新的HKEY_LOCAL_MACHINE\Software\Classes\Installer\Patches注册表项(在各个地方引用,例如这里:http: //support.microsoft.com/kb/971187 )。

显然还有一个您可以实例化和查询的 Microsoft Update 对象。此处详细介绍了一个示例:http: //msmvps.com/blogs/athif/archive/2005/11/20/76035.aspx

我不确定这是否完全满足您的需求;但这是我多年来学到的一些不同的东西......

于 2012-09-10T19:16:07.500 回答
0

在没有可靠且完整的编程方式来实现这一点的情况下,我最终使用了该wmic qfe命令。

于 2013-02-19T11:26:33.133 回答