当尝试创建一个 RunOnStartup 函数来检查天气或密钥是否存在以及如果存在,用户是否希望将其删除时,我遇到了访问被拒绝的问题。更具体地说是这个。
System.UnauthorizedAccessException: 'Cannot write to the registry key.'
Run Code Online (Sandbox Code Playgroud)
我的代码在这里。
private static void RunOnStartup()
{
string KeyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以创建密钥,只是不能删除它,很奇怪。也许我缺少一个权限,我尝试以管理模式运行,但发生了同样的事情。
您的代码中有两个错误:
异常UnauthorizedAccessException- “无法写入注册表项”表示您没有打开RegistryKeyinwritable模式。相反,您应该在尝试删除之前以写入模式打开它。确保您true作为第二个参数传递,如下所示:
RegistryKey reg = Registry.CurrentUser.OpenSubKey("SOFTWARE\\..", true);
reg.DeleteValue("MyApp");
Run Code Online (Sandbox Code Playgroud)另外,最初您的KeyName和if条件会检查HKEY_LOCAL_MACHINE,而您的插入/删除稍后会提到HKEY_CURRENT_USER使用Registry.CurrentUser,因此您应该使它们保持一致。
string KeyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
Run Code Online (Sandbox Code Playgroud)