以前,如何查询安装在Windows系统上的修补程序列表是discussed的,建议使用WMI和类Win32_QuickFixEngineering
来提供信息。然而,MSDN指出,从Vista开始,这个特定的类只返回热修复,而不是通过其他方式安装的更新。
An older question讨论了如何使用这个类来获取已安装的更新,这表明作者对使用它也不满意,因为我上面描述了一些限制。不幸的是,正如对接受答案的评论指出的那样,使用Windows Update Agent API的替代解决方案即使在随后删除了某个修补程序之后,仍然会指示该修补程序已经安装(它查询的是安装历史记录,而不是当前安装的更新)。
有谁知道如何在C#中(通过WMI或其他API)获得系统上安装的更新和热修复的完整列表,这不会排除安装更新的一些方法,也不会返回随后删除的更新?从本质上讲,我想要的数据集与“查看已安装的更新”窗格下的“程序和功能”中的数据集是相同的。
很抱歉,如果这个讨论应该在之前关注这个问题的任何一个相关问题上进行,但是以我目前的声誉,我唯一能对这两个问题做出贡献的方式就是提交一个新的答案,而这绝对不是提出像这样的进一步问题的正确方式。
谢谢!
发布于 2013-02-19 19:26:33
在缺乏可靠和完整的编程方法来实现这一点的情况下,我最终使用了wmic qfe
命令。
发布于 2012-09-11 03:16:08
据我所知,任何已安装和可以卸载的东西都必须在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
中注册,看起来子项名称KB999999是为系统更新(修补程序或服务包)保留的。更新的内容在名为ParentKeyName的子项中将有一个REG_SZ值,该子项链接到它更新的注册表项。
例如,我有SQL Server2008的Service Pack1,所以我在注册表中有一个子项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369
。它有一个名为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369\ParentKeyName
的REG_SZ值,其值为"Microsoft SQL Server10 Release“。因为我已经安装了SQL Server2008(因为KB968369是它的SP ),所以我还有一个HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft SQL Server 10 Release
,它是ParentKeyName链接。
您可以根据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
我不确定这是否完全满足了你的需要;但这是我多年来学到的一些东西……
https://stackoverflow.com/questions/12313795
复制相似问题