在Windows注册表中,我有一个子键\HKEY_CURRENT_USER\HTMPTK
,它具有两个值:Secret Token
和Token
。我想删除两个值。
我尝试使用key.DeleteValue("Secret Token")
(key
是RegistryKey
变量),但是却收到UnauthorizedAccessException
,并显示消息无法写入注册表项。
围绕MSDN和Google进行了修补,为了允许程序访问所需的内容,我发现了RegistryPermission
类以及一些示例作为指导。因此,我编写了以下代码:
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;
}
问题没有消失。
我在做什么错?我该如何解决这个问题?
稍后修改:
答案 0 :(得分:0)
原因是因为我使用了错误的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;
}
为什么我必须使用Registry.CurrentUser.DeleteSubKeyTree("HTMPTK", true);
而不是key.CurrentUser.DeleteSubKeyTree("HTMPTK", true);
是个谜。