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