以管理员身份运行的应用为何无法访问部分注册表项?
为什么管理员身份运行的应用仍无法访问部分注册表键?
嘿,这问题我之前也碰到过!你遇到的核心问题是Windows的注册表重定向机制在作祟,和管理员权限没关系哦。
背后的原因
在64位的Windows 10系统中,为了兼容32位旧程序,系统会自动对HKLM\SOFTWARE这类注册表路径做重定向:
- 当32位程序访问
HKLM\SOFTWARE时,系统会偷偷把请求转向HKLM\SOFTWARE\Wow6432Node这个专门给32位程序用的分支。 - 但你在注册表编辑器里看到的那个
Render子键,其实是存放在64位原生的HKLM\SOFTWARE分支里的——所以32位程序哪怕以管理员身份运行,也看不到它。
解决办法
给你两个可行的方案:
编译成64位程序
直接把你的项目目标平台改成x64,这样程序就会直接访问64位的注册表路径,不用再被重定向,自然能找到Render子键。强制32位程序访问64位注册表分支
如果必须保持32位编译,可以在打开注册表键的时候指定RegistryView.Registry64参数,修改后的代码大概是这样:var hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); var renderKey = hive.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render");这样就能绕过重定向,让32位程序直接读取64位的注册表内容。
另外补充个小细节:默认打开的注册表编辑器是64位版本的,所以你能看到那个Render子键;如果你开32位的regedit(路径是C:\Windows\SysWOW64\regedit.exe),同样也找不到它,这也能侧面验证重定向的问题。
内容的提问来源于stack exchange,提问作者Dave F




