以前,如何查询Windows系统上安装的修补程序列表discussed,建议使用WMI和类Win32_QuickFixEngineering
作为提供信息。但是MSDN表示从Vista开始,此特定类仅返回修补程序,而不返回通过其他方式安装的更新。
An older question讨论了如何使用此类来获取已安装的更新,表明由于上述限制,作者也不满意使用它。不幸的是,作为对已接受的答案的评论指出,使用Windows Update Agent API的替代解决方案仍将表明即使在随后删除了修补程序(它正在查询安装历史记录,而不是当前安装的更新)之后已安装了修补程序。
是否有人知道如何在C#中(通过WMI或其他API)获得系统上安装的更新和修补程序的完整列表,但这并不排除可以安装更新的某些方法,并且不会返回随后删除的更新?基本上,我使用的是“查看已安装的更新”窗格下“程序和功能”中提供的相同数据集。
如果之前关于这个问题的任何一个相关问题都应该讨论这个问题,那么道歉,但是我目前的声誉是我能提出新问题的唯一方法就是提交一个新答案,这绝对不是提出这样一个问题的正确方法。
谢谢!
答案 0 :(得分: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
的REG_SZ值,其值为“Microsoft SQL Server 10 Release”。因为我安装了SQL Server 2008(因为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
我不确定这是否完全符合你的要求;但这是我多年来学到的各种各样的东西......
答案 1 :(得分:0)
由于缺乏可靠而完整的编程方式来实现这一目标,我最终使用了wmic qfe
命令。