RegistryKey.OpenSubKey 抛出 SecurityException

RegistryKey.OpenSubKey throws SecurityException

这个问题可能有重复问题 and here,但从来没有得到充分的回答。

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

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: 'Requested registry access is not allowed.'

我是运行具有管理员权限的应用程序(使用右键单击+“运行作为管理员”或使用this),但这没有帮助。这是在我的个人机器上(64 位 Windows 10 Pro,版本 2004),我是管理员并且有足够的权限通过 regedit 更改注册表。

我做错了什么?

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

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

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