C#中如何正确使用注册表权限删除注册表子项?
How Can I Correctly Use Registry Permissions to Delete a Registry Subkey in C#?
在 Windows 注册表中,我有子项 \HKEY_CURRENT_USER\HTMPTK
,它有两个值:Secret Token
和 Token
。我想删除这两个值。
我试图使用 key.DeleteValue("Secret Token")
(key
是一个 RegistryKey
变量),但我得到了一个 UnauthorizedAccessException
,消息是 无法写入到注册表项.
修改 MSDN 和 Google,以允许程序访问它需要的权限,我找到了 RegistryPermission
class,以及一些示例作为指导。因此,我写了下面的代码:
private bool DeleteTokensFromRegistryEngine()
{
RegistryPermission perm = new RegistryPermission(PermissionState.Unrestricted);
perm.AddPathList(RegistryPermissionAccess.AllAccess, "HKEY_CURRENT_USER\HTMPTK");
RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK");
try
{
if (key != null)
{
key.DeleteValue("Secret Token"); //the same error message here
key.DeleteValue("Token");
}
}
catch (UnauthorizedAccessException U)
{
MessageBox.Show(U.Message);
return false;
}
finally
{
key.Close();
}
return true;
}
问题并没有消失。
我做错了什么?我该如何解决这个问题?
稍后编辑:
- 我仔细检查了我是否以管理员身份 运行 程序。我愿意;
- Windows Defender 没有发出任何可疑信号;
- 如果有帮助,我可以从注册表编辑器中删除这些值;
原因是因为我使用了错误的 OpenSubKey
ctor。正确的是:
OpenSubKey(String, RegistryRights)
在我的例子中,子项应该用以下方式打开:
RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK",RegistryKeyPermissionCheck.ReadWriteSubtree);
不过,还有一个更好的方法:因为我想删除这两个值,所以如果删除整个子键会更容易。我应用了这个方法,得到的代码是:
try
{
Registry.CurrentUser.DeleteSubKeyTree("HTMPTK", true);
}
catch (UnauthorizedAccessException U)
{
MessageBox.Show(U.Message);
return false;
}
在 Windows 注册表中,我有子项 \HKEY_CURRENT_USER\HTMPTK
,它有两个值:Secret Token
和 Token
。我想删除这两个值。
我试图使用 key.DeleteValue("Secret Token")
(key
是一个 RegistryKey
变量),但我得到了一个 UnauthorizedAccessException
,消息是 无法写入到注册表项.
修改 MSDN 和 Google,以允许程序访问它需要的权限,我找到了 RegistryPermission
class,以及一些示例作为指导。因此,我写了下面的代码:
private bool DeleteTokensFromRegistryEngine()
{
RegistryPermission perm = new RegistryPermission(PermissionState.Unrestricted);
perm.AddPathList(RegistryPermissionAccess.AllAccess, "HKEY_CURRENT_USER\HTMPTK");
RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK");
try
{
if (key != null)
{
key.DeleteValue("Secret Token"); //the same error message here
key.DeleteValue("Token");
}
}
catch (UnauthorizedAccessException U)
{
MessageBox.Show(U.Message);
return false;
}
finally
{
key.Close();
}
return true;
}
问题并没有消失。
我做错了什么?我该如何解决这个问题?
稍后编辑:
- 我仔细检查了我是否以管理员身份 运行 程序。我愿意;
- Windows Defender 没有发出任何可疑信号;
- 如果有帮助,我可以从注册表编辑器中删除这些值;
原因是因为我使用了错误的 OpenSubKey
ctor。正确的是:
OpenSubKey(String, RegistryRights)
在我的例子中,子项应该用以下方式打开:
RegistryKey key = Registry.CurrentUser.OpenSubKey("HTMPTK",RegistryKeyPermissionCheck.ReadWriteSubtree);
不过,还有一个更好的方法:因为我想删除这两个值,所以如果删除整个子键会更容易。我应用了这个方法,得到的代码是:
try
{
Registry.CurrentUser.DeleteSubKeyTree("HTMPTK", true);
}
catch (UnauthorizedAccessException U)
{
MessageBox.Show(U.Message);
return false;
}