我正在尝试删除一些注册表项,但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 :(得分: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在下面解释。)