【发布时间】: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命令。无论如何,很高兴这对你有用。我不需要代表;随意写下你自己的答案并接受它。