我多年前编写了一个PC审计工具,并一直保持最新状态.其中一个基本功能是报告正在审核的PC上运行的Windows版本,我一直使用GetVersionEx调用.
这适用于Windows 8,但在Windows 10下不受支持,Windows 10确实像Windows 8一样返回8.2.Microsoft似乎没有引入任何直接替代品,而是建议您检查所需的特定功能而不是查看操作系统,但出于审计的目的,我实际上需要操作系统名称.
'scanner'是一个C++程序,必须在非特权帐户下运行,所以我不认为我读过另一个建议 - 拿起系统DLL的版本如kernel32.dll将起作用,因为这些文件夹通常无法访问给用户.
欢迎任何其他建议/想法!
昨天发布的 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 上运行:
调用 WMI 查询 Win32_OperatingSystem 并检查 Name 属性,该属性仅显示“Windows 11”。这是不完整的(它不包括“Enterprise”等 SKU),并且 WMI 相对较慢且稍显脆弱,因此对于我的用例而言,这不是一个可接受的解决方案。
检查内部版本号是否高于 21996(测试版)或 22000(首次公开发布)。如上所述,这不包括 SKU,并且需要一些手动 jiggery-pokery 才能构建完整的字符串。
运行sysinfo并解析输出。这非常慢,而且可能很脆弱(我没有检查过,但输出可能会本地化为不同的语言)。
winver知道,但它是一个 GUI 应用程序,所以我无法以编程方式精确查询它。
对于如何以高效且完整的方式从我的操作系统中获取字符串“Windows 11 Enterprise”(或“Windows 11 Pro”等,视情况而定),是否有人有任何其他想法?WMI、sysinfo 和 winver 从哪里获取它?
我需要从 .NET 库执行此操作,但 P/Invokes/本机函数调用是可接受的解决方案。
我问的是这两个注册表项:
两者似乎都包含 Windows 10 内部版本号(RTM/TH1 为 10240,1511/TH2 为 10586)。
这两者之间有任何(记录在案的)区别吗?我应该使用哪一个来确定 Windows 10 的“版本”?
脚注:我知道通常检查所需的功能比检查版本号更好。但是,请注意,想要获取当前正在运行的操作系统的版本是合法的,如果需要,我很乐意在评论中讨论。
我使用 TOSVersion.ToString 函数(使用 SysUtils)来检测 Windows 版本。然而,这是我在 Windows11 中得到的:
Windows 10 (Version 10.0, Build 21996, 64-bit Edition)
有没有可靠的方法来检测Windows 11?我正在使用德尔福10.3.3。
更新:Windows 11 正式发布,我再次尝试。这是我得到的:
Windows 10 (Version 10.0, Build 22000, 64-bit Edition)
windows ×2
windows-10 ×2
windows-11 ×2
.net ×1
.net-core ×1
c# ×1
c++ ×1
delphi ×1
registry ×1