Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RegistryKey.OpenSubKey引发SecurityException_C#_Registry - Fatal编程技术网

C# RegistryKey.OpenSubKey引发SecurityException

C# RegistryKey.OpenSubKey引发SecurityException,c#,registry,C#,Registry,这个问题可能有重复的地方,但从来没有得到充分的回答 我有幸重命名了一个Users文件夹,并且不得不更改注册表中的“几个”键。这已经完成了,但我很好奇是否有人可以自动化这个过程。为此,我尝试如下方式遍历注册表树: using Microsoft.Win32; using System; using System.Collections.Generic; namespace RegistryReplacer { class Program { private st

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

我有幸重命名了一个Users文件夹,并且不得不更改注册表中的“几个”键。这已经完成了,但我很好奇是否有人可以自动化这个过程。为此,我尝试如下方式遍历注册表树:

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);
            }
        }
    }
}
使用Microsoft.Win32;
使用制度;
使用System.Collections.Generic;
命名空间注册表替换程序
{
班级计划
{
私有静态无效打印密钥(注册表密钥)
{
WriteLine(“{0}有{1}个子键”,key.Name,key.SubKeyCount);
}
私有静态void traverseKey(注册表密钥)
{
使用(键)
{
打印键(key);
string[]subKeyNames=key.GetSubKeyNames();
foreach(subKeyName中的字符串subKeyName)
{
RegistryKey subKey=key.OpenSubKey(subKeyName);
traverseKey(子键);
}
}
}
静态void Main(字符串[]参数)
{
List rootKeys=新列表{
Registry.LocalMachine,
Registry.CurrentUser,
Registry.ClassesRoot,
Registry.CurrentConfig,
注册表.用户
};
foreach(根密钥中的RegistryKey根密钥)
{
traverseKey(rootKey);
}
}
}
}
我可以遍历树的根(LocalMachine等),但在某些键(不是全部键)上调用
OpenSubKey
时,我会遇到

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

我使用管理员权限运行应用程序(使用rightclick+“以管理员身份运行”或使用),但这没有帮助。这是在我的个人计算机(64位Windows 10 Pro,2004版)上,我是管理员,有足够的权限通过regedit更改注册表


我做错了什么?

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

下面是一个非常好的答案,它深入地解释了这个问题:


所以,你做的每件事都是正确的,它并没有按预期工作。“这不是一个bug,这是一个特性”(c)

我以前有过这个。我认为您需要将
OpenSubKey
的第二个值指定为True或True。在您链接的第一个问题中,他们这样做了,但他们没有像您一样拥有完全的管理功能。@JimmySmith第二个参数定义了如果我没有弄错的话,您是否需要写访问权限。到目前为止,我只是在阅读。奇怪-你说不是全部,只是一些注册表项?您所处的网络中的组策略可能会限制某些?@JimmySmith是的,这两种策略都适用。最后一个输出是
HKEY\U LOCAL\U MACHINE\SAM有1个子键
,并且我的控制台的缓冲区完全充满了消息,因此它确实能够遍历相当多的键。我不在有组策略或类似策略的网络上。某些密钥只能在作为系统帐户运行时读取。例如,您可以使用sysinternals中的PsExec来执行此操作:
PsExec-i-s c:\mypath\myprogram.exe
应该可以工作