在尝试创建一个检查天气是否存在或不存在密钥的RunonStartup函数时,用户是否希望将其删除,我会遇到拒绝的访问问题。更具体地。
System.UnauthorizedAccessException: 'Cannot write to the registry key.'
我的代码在这里。
private static void RunOnStartup()
{
string KeyName = @"HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun";
string valueName = "MyApp";
if (Registry.GetValue(KeyName, valueName, null) == null)
{
RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
reg.SetValue("MyApp", Application.ExecutablePath.ToString());
MessageBox.Show("The Program will now start on startup", "Startup");
}
else
{
DialogResult dialogResult = MessageBox.Show("This Program can already run on Start up. Do you want it to no longer do so?", "Start Up", MessageBoxButtons.YesNoCancel);
if(dialogResult == DialogResult.Yes)
{
Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run").DeleteValue("MyApp");
}
else if(dialogResult == DialogResult.No)
{
MessageBox.Show("The Program will continue to run on Startup", "Startup", MessageBoxButtons.OK);
}
else if(dialogResult == DialogResult.Cancel)
{
//Do Nothing
}
}
}
我可以创建键,只是不删除它,很奇怪。也许我错过了一份许可,我试图以行政模式运行,但也发生了同样的事情。
代码中的两个错误:
-
异常
UnauthorizedAccessException
-'无法写入注册表密钥'表示您未在writable
模式下打开RegistryKey
。相反,您应该在尝试删除之前以写入模式打开它。确保您将true
作为第二个参数,因此:RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\..", true); reg.DeleteValue("MyApp");
-
最初,您的
KeyName
和if
条件在HKEY_LOCAL_MACHINE
中检查,而您的插入/删除后来使用Registry.CurrentUser
参考HKEY_CURRENT_USER
,因此您可能应该使它们保持一致。string KeyName = @"HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRun";