C# 如何删除注册表项?

C# 如何删除注册表项?,c#,registry,C#,Registry,我试图删除一些注册表项,但VS一直告诉我无法写入注册表项,我不明白为什么: public void refInstall() { RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp"); foreach(string subKeyName in regKey.GetVal

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

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

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

这可能不是你想听到的,但你需要摆脱在注册中心这个区域写作的习惯,找到一种不同的方式来实现你的目标。桌面应用程序期望对HKLM(实际上是程序文件目录)进行写访问的唯一合理时间是在安装时


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

您没有对HKLM的写访问权。您需要以提升的权限运行才能成功

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

这可能不是你想听到的,但你需要摆脱在注册中心这个区域写作的习惯,找到一种不同的方式来实现你的目标。桌面应用程序期望对HKLM(实际上是程序文件目录)进行写访问的唯一合理时间是在安装时


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

这有一个明显的问题:

您正在迭代注册表,但试图删除它们,就像它们是键一样

如果要使用值,请使用注册表项.DeleteValue

如果要使用键,请使用注册表键.GetSubKeyNames

另一个问题:

您正在以只读访问权限打开注册表项。您需要(注意末尾的额外bool):


(已删除有关目录的注释。存在于文件系统上。这是经过深思熟虑的,正如darky89在下面解释的那样。)

这有一个明显的问题:

您正在迭代注册表,但试图删除它们,就像它们是键一样

如果要使用值,请使用注册表项.DeleteValue

如果要使用键,请使用注册表键.GetSubKeyNames

另一个问题:

您正在以只读访问权限打开注册表项。您需要(注意末尾的额外bool):


(已删除有关目录的注释。存在于文件系统上。这是经过深思熟虑的,正如darky89在下面解释的那样。)

返回的实际错误是什么?您能提供确切的错误吗?第二,您是否以管理员身份运行VisualStudio?试一试。准确的错误:“UnauthorizedCassPermission:无法在注册表项中写入”(或者类似的,我正在用法语运行VS^^^)这两个答案似乎涵盖了所有内容。它能工作吗?返回的实际错误是什么?您能提供准确的错误吗?第二,您是否以管理员身份运行VisualStudio?试一试。准确的错误:“UnauthorizedCassPermission:无法在注册表项中写入”(或者类似的,我正在用法语运行VS^^^)这两个答案似乎涵盖了所有内容。它工作吗?我是管理员,当我以管理员身份运行调试文件夹中的.exe时,它会崩溃…默认情况下,管理员用户没有对HKLM的写入权限。在UAC下,它们使用受限权限令牌运行。他们必须明确提升流程以获得全部权限。但关键是,你必须改变你的习惯。我是管理员,当我以管理员身份运行调试文件夹中的.exe时,它会崩溃…管理员用户默认情况下没有对HKLM的写入权限。在UAC下,它们使用受限权限令牌运行。他们必须明确提升流程以获得全部权限。但重点仍然是,你必须改变你的习惯。“Directory.Exists作用于文件系统,而不是注册表。”哎哟!!MMMmmmm我知道我在做什么,我只是在清理已删除但仍在注册表中的文件夹:)别担心^^^但你是对的,这是一个明显的问题,但它仍然不起作用,我仍然无法在注册表中写入grrrr:p“目录。存在作用于文件系统,而不是注册表。”哎哟!!MMMmmmm我知道我在做什么,我只是在清理已删除但仍在注册表中的文件夹:)别担心^^^但你是对的,这是一个明显的问题,但仍然不起作用,我仍然无法在注册表中写入grrrrr:p
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Installer\Folders\MyApp", true);