如何删除注册表项?

时间:2011-03-07 19:24:46

标签: c# registry

我正在尝试删除一些注册表项,但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");  
             }  
         }  
     }  
}

2 个答案:

答案 0 :(得分:4)

您没有HKLM的写入权限。您需要使用提升的权限运行才能成功。

一直以来,HKLM的权利仅限于管理员组的成员。改变的是在Vista中引入UAC并且用户习惯性地在没有管理员权限的情况下开始运行。

这可能不是您想听到的,但您需要摆脱写入注册表区域的习惯,并找到实现目标的不同方法。桌面应用程序期望对HKLM(或实际上是Program Files目录)进行写访问的唯一合理时间是在安装时。

按照arx的描述修改代码后,您将不得不解决此问题。

答案 1 :(得分:1)

这有一个明显的问题:

您正在遍历注册表,但尝试将其删除,就好像它们是一样。

如果您想使用值,请使用RegistryKey.DeleteValue

如果您想使用密钥,请使用RegistryKey.GetSubKeyNames

另一个问题:

您正在以只读访问权限打开注册表项。你需要(注意最后的额外布尔):

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

(删除了关于作为文件系统的Directory.Exists的评论。这是故意的,因为darky89在下面解释。)