2011-03-07 103 views
0

我想删除一些注册表项,而是VS不断告诉我,我不能在注册表项中写,我不明白为什么:如何删除注册表项?

public void refInstall() 
{ 
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp"); 
    foreach(string subKeyName in regKey.GetValueNames()) 
    { 
     bool exist = Directory.Exists(subKeyName); 
     if (!exist) 
     { 
      regKey.DeleteSubKeyTree(subKeyName); 
      Console.WriteLine(subKeyName + ": N'EXISTE PAS"); 
      } 
     } 
    } 
} 
+0

什么返回实际的错误? – 2011-03-07 19:27:30

+0

你能提供确切的错误吗?其次是你作为管理员运行Visual Studio?试试看。 – 2011-03-07 19:27:53

+0

确切的错误:“UnauthorizedAcessPermission:不可能写在注册表键”(或类似的东西,我正在法国^^运行VS) – darky89 2011-03-07 19:32:20

回答

4

您不必HKLM写访问。您需要使用提升的权限运行才能成功。

一直以来,HKLM的权利一直只限于管理员组的成员。当UAC推出时,用户习惯性地在没有管理员权限的情况下开始运行,这种情况在Vista中发生了变化。

它可能不是你想听到的,但你需要摆脱写入注册表这个区域的习惯,并找到一种不同的方式来实现你的目标。对于桌面应用程序来说,期望对HKLM(或确实是Program Files目录)进行写入访问的唯一时间是安装时。

一旦按照arx所述修复代码,就必须解决此问题。

+0

我是管理员,当我在调试文件夹“以管理员身份”运行.exe时,它崩溃了...... – darky89 2011-03-07 19:30:01

+1

管理员用户在默认情况下没有对HKLM的写入权限。在UAC下,它们使用受限权限令牌运行。他们必须明确提升流程才能获得充分的权利。但重要的是,你必须改变你的习惯。 – 2011-03-07 19:31:18

1

这有一个明显的问题:

您是通过注册表值迭代但试图删除它们,好像他们是

如果要使用值使用RegistryKey.DeleteValue

如果你想使用密钥使用RegistryKey.GetSubKeyNames

另一个问题:

您正在以只读访问打开注册表项。你需要(注意末尾有额外的布尔):(演戏的文件系统上Directory.Exists删除评论这是经过深思熟虑的darky89如下解释。)

RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp", true); 

+0

“Directory.Exists作用于文件系统,而不是注册表。”哎哟!! – 2011-03-07 19:32:46

+0

MMMmmmm我知道我在做什么,我只是清理被删除的文件夹,但仍在注册表中:) – darky89 2011-03-07 19:33:53

+0

对不起,这有点儿公道。我已经更新了我的答案。 – arx 2011-03-07 19:54:10