我无法删除注册表子项

Posted

技术标签:

【中文标题】我无法删除注册表子项【英文标题】:I cant delete registry subkey 【发布时间】:2018-12-20 14:29:50 【问题描述】:

我正在为游戏制作应用程序,如果您禁止访问服务器。 HKEY_CURRENT_USERHKEY_CURRENT_USER\Software\Windows\ 中有 2 个随机数字键

button1(删除HKEY_CURRENT_USER处的第一个子键)

但是当我在 button2 中放入相同的代码时,它在 Software\windows 中的 find 子键,但它在删除时出错。

string[] dummy = new string[10];

foreach (string s in Registry.CurrentUser.OpenSubKey(@"Software\\Microsoft").GetSubKeyNames())

    RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\\Microsoft" + "\\" + s);
    string Key = rk.ToString();
    string Key2 = Key.Replace("HKEY_CURRENT_USER\\Software\\Microsoft\\", "");
    bool Check = IsDigitsOnly(Key2);
    if (Check)
    
        RegistryKey ecks = Registry.CurrentUser.OpenSubKey(@"Software\\Microsoft" + "\\" + s);
        
            string ecks2 = ecks.ToString();
            string ecksxd = ecks2.Replace("HKEY_CURRENT_USER\\Software\\Microsoft\\", "");
            string[] hello = GetRegistry2(ecksxd);
            Registry.CurrentUser.DeleteSubKey(Key2);
        
    

项目来源

CLICK HERE TO SEE SOURCE

【问题讨论】:

你到底得到了什么异常? 我得到了 ArgumentExpection 您应该展开您收到的异常并阅读消息。它可能会帮助您诊断问题 它说子键树不能被删除,因为没有子键。但是当我将鼠标放在(KEY2)上时,它会显示真正的子键 看来您要删除\Microsoft 中的任意键 是数字?这似乎是一个非常糟糕的主意,它不是一个乱七八糟的地方。该错误很可能是因为您只是将密钥名称传递给Registry.CurrentUser.DeleteSubKey(),它不知道相关路径。您还泄漏了所有这些一次性关键变量。 【参考方案1】:

完成!我发现错误。尝试直接删除子密钥时出现问题!

我添加了这个代码

RegistryKey hkcus = Registry.CurrentUser; RegistryKey sware = hkcus.OpenSubKey(@"Software\\",true); RegistryKey msoft = sware.OpenSubKey(@"Microsoft\\",true); msoft.DeleteSubKey(Key2,true);

【讨论】:

【参考方案2】:

假设您尝试删除 HKCU/Software/Microsoft/Blah/CurrentVersion/MyCoolSubKey 中的密钥。当你这样做时

string Key2 = Key.Replace("HKEY_CURRENT_USER\\Software\\Microsoft\\", "");

你的 Key2(为什么它是大写的?)变成了

Blah/CurrentVersion/MyCoolSubKey

然后你打电话

Registry.CurrentUser.DeleteSubKey(Key2);

Registry.CurrentUser.DeleteSubKey 不知道 Key2 的来源。它只是按照您所说的去做:“从 HKCU 中删除名为 Blah/CurrentVersion/MyCoolSubKey 的子项”

这实际上是一种删除尝试

HKCU/Blah/CurrentVersion/MyCoolSubKey

难怪它找不到那个子键。

虽然我认为您关于不加选择地删除注册表中的随机键的整个想法是完全有缺陷的,但谈到算法,您可以通过丢弃所有未使用的代码并保持简单来改进它,如下所示:

foreach (string s in Registry.CurrentUser.OpenSubKey("Software\\Microsoft").GetSubKeyNames())

    if (s.All(Char.IsDigit))
    
        Registry.CurrentUser.DeleteSubKey($"Software\\Microsoft\\s");
    

再一次,我非常不喜欢以这种方式干预注册表的想法。

【讨论】:

什么意思?当我按下按钮时,它会创建一个像 (MyCoolSubKey) 这样的子键,然后删除 HKCU/Software/Microsoft/ 的子键 什么意思?? 我需要在 button2_click 事件中创建一个示例吗?

以上是关于我无法删除注册表子项的主要内容,如果未能解决你的问题,请参考以下文章

如何删除注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\rising

注册表没有network子项

无法删除部分子项。这可能是因为进程打开了文件或将其工作目录设置在目标目录中

注册表项无法删除,怎么办?

删除movieclip子项的动作脚本

iOS 15.3+ SwiftUI中List子项目禁止被删除但头部仍显示删除按钮的解决