【发布时间】:2021-11-26 07:56:47
【问题描述】:
昨天发布的 Windows 11 几乎在所有地方都将自己报告为 Windows 10.0 - RtlGetVersion 说是 10.0,如果你问 VerifyVersionInfo 如果你是 11.0 或更高版本,它会说不是。
似乎没有新的 GUID 可以像 Windows 7、8、8.1 和 10 那样插入 app.manifest 以说“嘿,我支持 Windows 11”。
目前我依靠HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName 告诉我当前的 Windows 版本是什么,但在我升级的机器上,它仍然显示“Windows 10 企业版”,而不是“Windows 11 企业版”。
注册表中似乎只有一个地方包含文本“Windows 11”,那就是 BCD 部分(启动配置),也可以重命名,所以我不想碰它。
到目前为止,我只确定了几种方法来判断我是否在 Windows 11 上运行:
-
调用 WMI 来查询 Win32_OperatingSystem 并检查 Name 属性,它只是说“Windows 11”。这是不完整的(不包括“企业”等 SKU),而且 WMI 相对较慢且略显脆弱,因此对于我的用例来说,这不是一个可接受的解决方案。
-
检查内部版本号是否高于 21996(测试版)或 22000(首次公开发布)。如上所述,这不包括 SKU,并且需要一些手动的 jiggery-pokery 才能构建完整的字符串。
-
运行
sysinfo并解析输出。这很慢,而且可能很脆弱(我没有检查过,但输出可能会本地化为不同的语言)。 -
winver知道,但它是一个 GUI 应用程序,所以我无法通过编程方式准确地查询它。
是否有人对如何以高性能和完整的方式从我的操作系统中获取字符串“Windows 11 Enterprise”(或“Windows 11 Pro”等,视情况而定)有任何其他想法? WMI、sysinfo 和 winver 是从哪里获得的?
我需要从 .NET 库中执行此操作,但 P/Invokes/本机函数调用是可接受的解决方案。
【问题讨论】:
-
MS 长期以来一直提倡您根据需要测试功能,而不是检查操作系统版本。也许他们已经加倍努力,现在强迫你这样做?
-
这不是用于机器决策,而是用于通知开发人员的错误报告 - 我希望能够知道我的应用程序在哪个版本的 Windows 上崩溃。
-
将其命名为 Win11 是营销决策,与操作系统版本无关。它只是另一个 Win10 版本,在众多版本中,以内部版本号区分。如果是22000以上就知道是Win11了。
-
您应该记录内部版本号,而不是营销名称。这也可以让您区分不同版本的 Windows 10(18363、19042 等)
-
我们也记录了这一点,但我宁愿我们开始寻找正确的 Win11 版本或适当的正确 Win10 版本,而不是让开发人员早早越过他们的电线……我宁愿不负责永远维护我自己的操作系统版本映射。
标签: c# .net windows .net-core windows-11