如何在 Windows 11 中找到 Windows 产品名称?

yaa*_*kov 20 .net c# windows .net-core windows-11

昨天发布的 Windows 11 几乎在所有地方都将自己报告为 Windows 10.0 -RtlGetVersion说是 10.0,如果你问VerifyVersionInfo你是否是 11.0 或更高版本,它会说不是。

似乎没有新的 GUID 可以塞入 app.manifest 中来表示“嘿,我支持 Windows 11”,就像 Windows 7、8、8.1 和 10 那样。

目前,我依靠HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName告诉我当前的 Windows 版本是什么,但在我升级后的计算机上,它仍然显示“Windows 10 Enterprise”,而不是“Windows 11 Enterprise”。

注册表中似乎只有一个位置包含文本“Windows 11”,即 BCD 部分(启动配置),它也可以重命名,所以我不想碰它。

到目前为止,我只确定了几种方法来判断我是否在 Windows 11 上运行:

  1. 调用 WMI 查询 Win32_OperatingSystem 并检查 Name 属性,该属性仅显示“Windows 11”。这是不完整的(它不包括“Enterprise”等 SKU),并且 WMI 相对较慢且稍显脆弱,因此对于我的用例而言,这不是一个可接受的解决方案。

  2. 检查内部版本号是否高于 21996(测试版)或 22000(首次公开发布)。如上所述,这不包括 SKU,并且需要一些手动 jiggery-pokery 才能构建完整的字符串。

  3. 运行sysinfo并解析输出。这非常慢,而且可能很脆弱(我没有检查过,但输出可能会本地化为不同的语言)。

  4. winver知道,但它是一个 GUI 应用程序,所以我无法以编程方式精确查询它。

对于如何以高效且完整的方式从我的操作系统中获取字符串“Windows 11 Enterprise”(或“Windows 11 Pro”等,视情况而定),是否有人有任何其他想法?WMI、sysinfo 和 winver 从哪里获取它?

我需要从 .NET 库执行此操作,但 P/Invokes/本机函数调用是可接受的解决方案。

yaa*_*kov 13

把它留在这里,以便我以后可以找到它:

看来 Windows 本身(例如 winver)从 Windows 品牌中获取此信息 - 特别是从%WinDir%\Branding\Basebrd\en-US\basebrd.dll.mui.

要访问这一点可以使用%WinDir%\System32\winbrand.dll. 具体来说,该函数BrandingFormatString接受宽字符串 (LPW[C]STR) 并返回宽字符串。

例如BrandingFormatString("%WINDOWS_LONG%")返回"Windows 11 Pro"到我的家用电脑上。

我不知道结果字符串的生命周期语义,即是否/何时/如何释放它。

以下代码用作功能概念验证 (C# 9.0):

using System;
using System.Runtime.InteropServices;

[DllImport("winbrand.dll", CharSet = CharSet.Unicode)]
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
static extern string BrandingFormatString(string format);

Console.WriteLine(BrandingFormatString("Hello World from %WINDOWS_LONG%!"));

Run Code Online (Sandbox Code Playgroud)

  • 您实际上需要通过调用 GlobalFree 来释放内存,[这里有更多信息](https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is -运行#ver_string)。 (2认同)

agg*_*k02 5

tldr - 使用注册表中的EditionID和似乎是确定 Win10 与 Win11 以及软件“版本”的可靠方法。在 Windows 10 专业版和 Windows 11 专业版上为“专业”,并告诉您是 10 还是 11。CurrentBuildCurrentVersionEditionIDCurrentBuild >= ~22000

注册表值的集合HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion揭示了微软方面缺乏规划的感觉。其中ReleaseId,这个数字随着每个 Windows 10 版本的不同而发生变化(例如,1903, 1909, 2004,...),直到 Windows 10 20H2 的最后一次更改为2009。同时DisplayVersion添加 ,并设置为20H2

随后Windows 10 21H1发布,并ReleaseId莫名停留在2009.

事实上,当前的 Windows 10 和 Windows 11 版本可以具有相同的DisplayVersion(例如,21H2当 Windows 10 21H2 即将发布时)和ProductName(例如Windows 10 Pro),这确实令人头疼。(感谢 @yaakov 发现我说的时间是 21H1 的错误。)