以前,已经讨论过如何查询安装在Windows系统上的修补程序列表,并build议使用WMI和类Win32_QuickFixEngineering
来提供信息。 但MSDN表明,从Vista开始,这个特定的类只返回修补程序,而不是其他方式安装的更新。
一个较老的问题讨论了使用这个类来获取已安装的更新,表明作者也不满意使用它,因为我上面描述的限制。 不幸的是,作为接受的答案的一个评论指出,使用Windows更新代理API的替代解决scheme仍然表明即使它已经被删除(它正在查询安装历史logging,而不是当前安装的更新)已经安装了修复程序, 。
有没有人知道如何在C#中(通过WMI或其他API)获取系统上安装的更新和修补程序的完整列表,该列表不排除可能安装更新的某些方法,并且不会返回随后删除? 基本上,我使用的是“查看已安装的更新”窗格下的“程序和function”中提供的相同数据集。
如果这个讨论应该在前面讨论这个问题的任何一个相关的问题上抱歉,但是以我目前的声望来说,我可以对这两个问题做出贡献的唯一方法就是提交一个新的答案,这绝对不是正确的方法再问一个这样的问题。
谢谢!
据我所知,任何已安装并能够卸载的东西都必须在注册表中注册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安装具有“ServicePack”的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KB968369\ReleaseType
值,
我假设只有可以卸载的更新注册在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
我不确定这是否完全给你你想要的东西; 但是这些年来我学到了很多东西
在没有一个可靠和完整的编程方式来实现这个我结束了使用wmic qfe
命令。