C 如何检测 Windows 10

新手上路,请多包涵

多年前我编写了一个 PC 审计工具,并且一直在更新它。基本功能之一是报告正在审核的 PC 上运行的 Windows 版本,我一直使用 GetVersionEx 调用。

这适用于并包括 Windows 8,但在 Windows 10 下不受支持,实际上 Windows 10 会像 Windows 8 一样返回 8.2。微软似乎没有引入任何东西作为直接替代,而是建议您检查所需的特定功能而不是查看操作系统,但出于审核目的,我实际上想要操作系统名称。

“扫描仪”是一个必须在非特权帐户下运行的 C++ 程序,所以我认为我没有阅读过另一个建议 - 选择系统 DLL 的版本(如 kernel32.dll)将起作用,因为这些文件夹通常无法访问给用户。

欢迎任何其他建议/想法!

原文由 user1169502 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 629
1 个回答

从 Windows 8.1 开始, GetVersion()GetVersionEx() 以应用程序表现为准:

随着 Windows 8.1 的发布, GetVersionEx API 的行为发生了变化,它将为操作系统版本返回的值。 GetVersionEx 函数返回的值现在取决于应用程序的显示方式。

未针对 Windows 8.1 或 Windows 10 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。一旦针对给定的操作系统版本显示应用程序, GetVersionEx 将始终返回应用程序在未来版本中显示的版本。要为 Windows 8.1 或 Windows 10 显示您的应用程序,请参阅 为 Windows 定位您的应用程序

较新的 Version Helper 函数 只是 VerifyVersionInfo() 的包装器。从 Windows 10 开始,它现在也受到表现形式的影响:

Windows 10: VerifyVersionInfo 如果 lpVersionInfo 参数设置为指定 Windows 8.1 或 Windows 10,则在由不具有 Windows 8.1 或 Windows 10 兼容性清单的应用程序调用时返回 false ,即使当前操作系统版本是 Windows 8.1 或 Windows 10。具体而言, VerifyVersionInfo 具有以下行为:

  • 如果应用程序没有清单,则 VerifyVersionInfo 的行为就像操作系统版本是 Windows 8 (6.2)。
  • 如果应用程序的清单包含与 Windows 8.1 对应的 GUID,则 VerifyVersionInfo 的行为就像操作系统版本是 Windows 8.1 (6.3)。
  • 如果应用程序的清单包含与 Windows 10 对应的 GUID,则 VerifyVersionInfo 的行为就像操作系统版本是 Windows 10 (10.0)。

Version Helper 函数 使用 VerifyVersionInfo 函数,因此行为 IsWindows8Point1OrGreaterIsWindows10OrGreater 类似地受到清单的存在和内容的影响。

要为 Windows 8.1 或 Windows 10 显示您的应用程序,请参阅 为 Windows 定位您的应用程序

要获得 真正 的操作系统版本,无论表现形式如何,请使用 RtlGetVersion()NetServerGetInfo()NetWkstaGetInfo() 代替。它们都报告了准确的操作系统版本,并且不受表现形式的影响(还没有?)。

(微软曾经建议查询系统 DLL 的文件版本,但当 Windows 没有更新系统 DLL 版本以匹配时,他们 不再 建议。)

原文由 Remy Lebeau 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题