【发布时间】:2020-07-24 20:39:14
【问题描述】:
here 和 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: '请求的注册表访问是不允许的。'
我正在以管理员权限运行应用程序(使用右键单击+“以管理员身份运行”或使用 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应该可以工作