You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell获取Windows版本时注册表读取异常问题求助

问题解答

这是不是Bug?

这种情况不是Windows系统的原生Bug,大概率由以下两种原因导致:

  • 注册表虚拟化:Windows为兼容旧版程序,会将普通用户对HKLM(系统级注册表)的修改重定向到用户专属的虚拟注册表路径(HKCU\Software\Classes\VirtualStore\Machine\Software)。如果之前有程序以普通用户权限修改过该注册表项,你读取到的就是这个虚拟副本的值,而非系统真实值。
  • 系统升级/部署残留:如果你的系统是从Windows 10升级到Windows 11,或是通过批量部署工具安装,可能存在注册表项未被正确更新的情况——管理员权限下读取到的是旧版本的残留值,而普通用户触发虚拟化后读取到另一个错误值。

更优的Windows产品名称获取方法

推荐以下几种可靠方法,规避注册表读取的权限/虚拟化问题:

方法1:使用CIM实例(最推荐)

通过Get-CimInstance调用系统API直接获取,结果准确且不受注册表影响:

# 获取完整系统名称(如"Microsoft Windows 11 Pro")
(Get-CimInstance Win32_OperatingSystem).Caption

# 获取系统SKU编码(可对应具体版本)
(Get-CimInstance Win32_OperatingSystem).OperatingSystemSKU

常见SKU编码对应:

  • 48 = Windows 11 Pro
  • 194 = Windows 11 Enterprise
  • 4 = Windows 10 Pro
  • 12 = Windows 10 Enterprise

方法2:使用systeminfo命令

通过系统内置命令提取系统版本信息:

systeminfo | Select-String "OS Name"

方法3:强制读取系统级注册表(避免虚拟化)

如果坚持使用注册表,可通过reg query命令强制读取系统级路径,或在PowerShell中明确指定不使用虚拟化:

# 使用reg query命令
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

# PowerShell中明确读取64位注册表视图(适用于32位PowerShell环境)
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName -ErrorAction Stop).ProductName

内容的提问来源于stack exchange,提问作者Avner Hilu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:15:16