即使具有管理员权限也无法读取/写入 HKLM 注册表项和值

Posted

技术标签:

【中文标题】即使具有管理员权限也无法读取/写入 HKLM 注册表项和值【英文标题】:Can't read/write HKLM registry keys and values even with admin privileges 【发布时间】:2020-01-16 20:54:16 【问题描述】:

我正在尝试从我的 C# 应用程序中读取(并最终编辑)HKEY_LOCAL_MACHINE 中的一些键。 该应用程序已经以管理员身份启动(我已经使用 requireAdmin 创建了一个 app.manifest),它会在启动时显示 UAC。但是,我可以做一些其他的管理工作,但仍然无法访问 HKLM。

我在使用此代码时收到 System.Security.SecurityException:

foreach (string s in My.Computer.Registry.LocalMachine.GetSubKeyNames)
    
     if .....
    

经过多次尝试,我似乎可以看到一些键(和值),但不是全部。 也许我可以用 setaccesscontrol 做点什么,其他人有什么想法吗?我在网上没有找到任何好的文档,大家都说我必须通过清单文件设置管理员权限,但我已经完成了。

【问题讨论】:

你能看到哪些?哪个看不到? 【参考方案1】:

最可能的原因是您试图从 64 位 应用程序中读取 32 位 密钥,反之亦然。你可以在这里阅读更多关于registry virtualisation的信息

您需要在您的应用程序中使用适当的位数,或使用以下内容读取写入

RegistryView Enum

指定在 64 位操作系统上以哪个注册表视图为目标。

RegistryKey.OpenBaseKey

在本地打开一个表示请求的键的新 RegistryKey 具有指定视图的机器。

【讨论】:

谢谢,这对我帮助很大。似乎使用 64 位视图也会在 HKLM\Software 中显示 32 位密钥,并将它们放在名为 Wow6432Node 的密钥中。但是,我的代码还有另一个问题,因为我使用的是外部 try...catch 并且我从“regedit”中意识到我无权读取 HKLM\Security 和另一个名为 BCD0000 的密钥,因此外部 try...cath立即抛出SecurityException。现在我有一个内部尝试...cath 跳过它们

以上是关于即使具有管理员权限也无法读取/写入 HKLM 注册表项和值的主要内容,如果未能解决你的问题,请参考以下文章

推荐的注册表用法

C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM

innosetup如何往注册表写入多条

Win7系统如何运行PsExec打开一个注册表项HKLM\SAM\SAM

即使设置了权限,也无法写入 Android 外部存储

即使具有管理员权限,批处理脚本访问也被拒绝