【问题标题】:How to call "reg delete KEY /f" from C#如何从 C# 调用“reg delete KEY / f”
【发布时间】:2017-05-08 15:28:54
【问题描述】:

请向我解释为什么我的代码不起作用,因为我目前处于 (╯°□°)╯︵ ┻━┻ 模式,以挽救我的理智。

任务:在不提示的情况下从 C# 中删除注册表项。
要求:通过从 C# 调用 cmd.exe -> "reg delete KEY /f" 来完成
为什么:只是因为我想知道为什么它对我不起作用,哈哈……现在,我承认失败并诉诸 Microsoft.Win32.Registry.DeleteSubKey

我有一个基本的控制台应用程序,方法如下:

    private static int RunCmd(string command)
    {
        try
        {
            ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe");
            cmdsi.Arguments = command;
            Process cmd = Process.Start(cmdsi);
            cmd.WaitForExit();
            return 0;
        }
        catch
        {
            return 1;
        }
    }

我调用它是为了删除我的 MS Office 插件的注册表项,如下所示:

RunCmd(@"/c reg delete HKEY_LOCAL_MACHINE\SOFTWARE\...\MyAddin /f");

问题:它不起作用(密钥未删除)。

现在,密钥存在,我正在运行执行此操作的程序以管理员身份,所以不是这样。现在,如果您将执行行更改为:

RunCmd(@"/k reg delete HKEY_LOCAL_MACHINE\SOFTWARE\...\MyAddin");

... 将出现命令窗口,您可以清楚地看到它是以管理员身份运行的,并且会询问您是否要删除粘贴在您面前的密钥,就像您想要的那样。如果您回答是,您将被告知
错误:系统无法找到指定的注册表项或值。

现在最大的笑话 - 复制粘贴


reg 删除 HKEY_LOCAL_MACHINE\SOFTWARE...\MyAddin /f


进入提升的 cmd 提示符并运行它。 它会正常运行,并且密钥会被删除

WTF?
有人吗?

【问题讨论】:

  • 可能是 32 位与 64 位的问题?您要删除的密钥属于 64 位应用程序,并且您在 64 位版本的 Windows 上运行,因此您启动的命令提示符是 64 位进程,但您的应用程序是 32 位进程?
  • 成功了!这就是解决方案。请将其发布为答案,以便我可以向您提供一些代表;)
  • 在项目 -> 属性 -> 构建选项卡中取消选中“首选 32 位”解决了问题...但仍在等待您将其作为答案提交 ;)
  • 您也可以将/reg:64 标志传递给reg 命令。但我强烈建议为此使用普通 API,而不是使用 reg 命令。无论如何,很高兴这对你有用。我不需要代表;随意写下你自己的答案并接受它。

标签: c# registry


【解决方案1】:

正如 Cody Gray 在上面的 comment 中回答的那样,这个问题与 32 位和 64 位有关。在项目属性 -> 构建选项卡中未选中“首选 32 位”选项修复了该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2010-10-03
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多