【问题标题】:RegistryKey.OpenSubKey throws SecurityExceptionRegistryKey.OpenSubKey 抛出 SecurityException
【发布时间】:2020-07-24 20:39:14
【问题描述】:

herehere 这个问题可能有重复,但从未得到充分的回答。

我很高兴重命名了用户文件夹,并且不得不更改注册表中的“一些”键。这已经完成了,但我很好奇是否可以自动化这个过程。为此,我尝试像这样遍历注册表树:

using Microsoft.Win32;
using System;
using System.Collections.Generic;

namespace RegistryReplacer
{
    class Program
    {

        private static void printKey(RegistryKey key)
        {
                Console.WriteLine("{0} has {1} sub keys", key.Name, key.SubKeyCount);
        }

        private static void traverseKey(RegistryKey key)
        {
            using (key)
            {
                printKey(key);

                string[] subKeyNames = key.GetSubKeyNames();
                foreach(string subKeyName in subKeyNames)
                {
                    RegistryKey subKey = key.OpenSubKey(subKeyName);
                    traverseKey(subKey);
                }

            }
        }


        static void Main(string[] args)
        {
            List<RegistryKey> rootKeys = new List<RegistryKey> {
                Registry.LocalMachine,
                Registry.CurrentUser,
                Registry.ClassesRoot,
                Registry.CurrentConfig,
                Registry.Users
            };

            foreach (RegistryKey rootKey in rootKeys)
            {
                traverseKey(rootKey);
            }
        }
    }
}

我可以遍历树的根(LocalMachine 等),但是在某些键(不是全部)上调用 OpenSubKey 时,我遇到

System.Security.SecurityException: '请求的注册表访问是不允许的。'

我正在以管理员权限运行应用程序(使用右键单击+“以管理员身份运行”或使用 this),但这无济于事。这是在我的个人计算机上(64 位 Windows 10 Pro,版本 2004),我是管理员,并且有足够的权限通过 regedit 更改注册表。

我做错了什么?

【问题讨论】:

  • 我以前有过这个。我相信您需要将 OpenSubKey 的第二个值指定为 True 或 #2 here I believe。他们在您链接的第一个问题中就这样做了,但他们不像您那样拥有完整的管理员。
  • @JimmySmith 如果我没记错的话,第二个参数定义你是否需要写权限。到目前为止,我只是在阅读。
  • 奇怪 - 你说这不是全部,而只是一些注册表项?您不在一个可能会受到组策略限制的网络上?
  • @JimmySmith 是的,两者都是。最后一个输出是HKEY_LOCAL_MACHINE\SAM has 1 sub keys,我的控制台缓冲区完全填满了消息,所以它确实设法遍历了很多键。而且我没有使用组策略或任何类似的网络。
  • 某些密钥只能在以系统帐户运行时读取。例如,您可以使用 sysinternals 中的 PsExec 来做到这一点:psexec -i -s c:\mypath\myprogram.exe 应该可以工作

标签: c# registry


【解决方案1】:

此问题与注册表项所有权有关 - 它很可能具有自定义权限并由 SYSTEM、TrustedInstaller 或其他帐户拥有。

这是一个很好的答案,它深入解释了问题:https://superuser.com/a/493121

所以,您所做的一切都是正确的,但它并没有按预期工作。 “这不是错误,这是一项功能”(c)

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多