如何通过编程检测Windows 8.1更新是否已安装

5
我希望能从一个C#应用程序中检测最新的Windows 8.1 更新 (KB 2919355) 是否已安装。
我在微软的任何网站或谷歌上都没有找到任何关于如何实现这一点的信息。
谢谢!

我正在运行8.1,显示版本为6.2.9200.0。 - Darren Kopp
2
你为什么想知道呢?我问这个问题是因为如果你发现你的程序依赖于在Windows 8.1更新中改变了的行为,那么你可以测试一下这个特定的行为(通常来说这比硬编码版本检查更好)。 - user743382
1
这可能会有所帮助 https://dev59.com/DWQm5IYBdhLWcg3wtA0_ - Bit
@DarrenKopp:那是Windows 8.0... - Ben Voigt
3
查询注册表路径 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 中的 BuildLabEx 值,并解析第二个数字。如果该值大于17031,则表示已安装更新。 - magicandre1981
显示剩余8条评论
3个回答

2
该更新实际上是一个“累积更新”或其他独立较小更新的集合。如果您转到更新的知识库页面并向下滚动到“文件信息”,您可以看到该更新实际上是以下其他更新的组合。
  • KB2919442
  • KB2919355
  • KB2932046
  • KB2937592
  • KB2938439
  • KB2934018

然后,您需要检查所有列出的更新是否已应用或单个主更新是否已应用。我不确定如何仅使用C#进行此操作,但通过命令行,您可以通过控制台命令轻松完成。

wmic qfe get hotfixid | find "KB2919355"

有趣的是我们的列表不匹配。此外,来自链接页面:“您还可以使用Dism命令验证更新的安装或卸载。” - Ben Voigt
@BenVoigt DISM需要提升的提示,而WMI方法可以在不提升权限的情况下完成(我删除了检查DLL版本的部分,因为使用DISM或WMI是更好的方法)。 - Scott Chamberlain

0

我从MSDN下载安装了Windows 8.1更新,在它在Windows Update上线之前。它被分发为一系列带有ReadMe的MSU文件。如果您选择检测它们的存在,ReadMe中的更新列表可能会很有用。

Windows 8.1, Windows Server 2012 R2, Windows RT 8.1 Update

Recommended Install Order
1.  KB2919442
2.  KB2919355
3.  KB2932046
4.  KB2937592
5.  KB2938439
6.  KB2949621

第6个KB号码没有指向有效的KB页面,也许是ReadMe文件错误,因为在KB2919355升级包的KB页面上显示了不同的编号(然而,访问该页面会将您重定向回KB2919355页面)。 - Scott Chamberlain
@ScottChamberlain:从MSDN分发的更新中包括Windows8.1-KB2949621-v2-x64.msu。谷歌建议其中一个可能仅适用于服务器SKU。 - Ben Voigt

0

这可能是罪魁祸首:

Windows 8.1和Windows Server 2012 R2中的操作系统版本更改

表现

在Windows 8.1中,GetVersion(Ex) API已被弃用。这意味着虽然您仍然可以调用API,但如果您的应用程序没有专门针对Windows 8.1进行定位,则会获得Windows 8版本(6.2.0.0)。

解决方案

为了针对Windows 8.1进行定位,您需要包含应用程序清单或在源文件中包含_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_LATEST)。

所需清单内容的详细信息在文章中给出。


2
他不是在尝试检测8.1与8.0之间的区别,而是在测试安装了补丁的8.1和未安装补丁的8.1之间的差异。(但是补丁可能会更改(我没有检查)Windows版本号中的构建号,因此它仍然可以工作) - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接