在你试图回答这个问题之前,"在谷歌上快速搜索。"。在这种情况下,我有以下方法尝试修改注册表项值。我遇到的问题是,当执行时,它会抛出一个UnauthorizedAccessException,即使我已经将密钥打开为可写。我以管理员的身份运行Visual Studio,甚至试图制作一个带有清单文件的小.exe,迫使它以管理员身份运行,这样执行代码就不会有任何运气。该键已存在,它不会尝试进入CreateKey方法。这是代码块。
Path = "S-1-5-21-1644491937-1078145449-682003330-5490SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem"
Key = "DisableTaskMgr"
NewValue = 1
public OperationResult ModifyKey()
{
OperationResult result = new OperationResult();
if (!Path.IsNullOrEmptyTrim())
{
if (!Key.IsNullOrEmptyTrim())
{
try
{
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);
if (key != null)
{
key.SetValue(Key, NewValue);
key.Close();
}
else
{
result = CreateKey();
}
}
catch (Exception ex)
{
result.SetFail("Error accessing registry", ex);
}
}
else
{
result.SetFail("Registry key was null");
}
}
else
{
result.SetFail("Registry path was null");
}
return result;
}
我是否必须手动走下注册表树,将每个OpenSubKey调用设置为可写?我也试过了,还是犯了同样的错误。。。
在密钥的var中
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);
更改为
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, RegistryKeyPermissionCheck.ReadWriteSubTree);
您尝试过设置访问规则和权限吗?
string user = Environment.UserDomainName + "\" + Environment.UserName;
RegistryAccessRule rule = new RegistryAccessRule(user,
RegistryRights.FullControl,
AccessControlType.Allow);
RegistrySecurity security = new RegistrySecurity();
security.AddAccessRule(rule);
var key = Microsoft.Win32.Registry.Users.OpenSubKey(subKeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
key.SetAccessControl(security);
我在代码中看到的一个可能的问题是,Path
变量被设置为不转义字符的字符串。像这样的东西怎么样
Path = @"S-1-5-21-1644491937-1078145449-682003330-5490SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem";
为了弄清楚发生了什么,我创建了一个简单的服务来测试将作为本地系统帐户运行的代码。这是我能想到的尝试运行代码的最高权限。使用这些权限运行代码是有效的。
特别感谢0____0和Charleh指出防病毒措施。我检查了日志,结果发现它试图隔离我的更改。我想即使这样也不会阻止系统用户进行这些更改。
特别感谢Sorceri帮助我研究了这么多。
总之,如果你有间歇性的、非常奇怪的行为,请检查你的病毒扫描程序和权限。
我最近遇到了同样的问题。所以我尝试了一些方法,并没有调用key.SetValue(Key, NewValue)
,而是简单地调用create函数解决了我的问题。也就是说;
Microsoft.Win32.RegistryKey key1 = Microsoft.Win32.Registry.Users.CreateSubKey(Path);
key1.SetValue(Key, NewValue);
CreateSubKey调用不会删除当前条目,但提供了无异常写入的功能。我希望这能有所帮助。
仅将授予设置为dword。您必须打开注册表并在最后一个文件夹路径上,右键单击它并设置Grants,然后选择All Aplications并选中Total Control。我希望能帮助你。
仅Registry.SetValue(sub_key, key, value);
示例:
Registry.SetValue(
@"HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun",
"MyApp",
Application.ExecutablePath);