0

在 Windows 中,当打开命令提示符 (cmd.exe) 时,注册表项:

HKLM\Software\Microsoft\Command Processor
HKCU\Software\Microsoft\Command Processor

检查名为“AutoRun”的值。如果找到,则执行值中指定的批处理文件,提供类似自动执行的功能。如果两个键都包含 AutoRun 值,则两者都将运行。惊人的!

我正在使用Process.Start运行 cmd.exe 并且没有发生自动运行行为。我目前的代码是:

private openShell( string folder )
{
    ProcessStartInfo startInfo = new ProcessStartInfo()
        {
            FileName = Environment.GetEnvironmentVariable( "COMSPEC" ) ?? "cmd.exe",
            Arguments = "/k cd \"" + folder + "\"",
            UseShellExecute = true
        };

    try
    {
        using ( var exeProcess = System.Diagnostics.Process.Start( startInfo ) )
        {
            exeProcess.WaitForExit();
        }
    }
    catch
    {
        // Log error.
    }
}

我还尝试将其简化为最简单的形式:

System.Diagnostics.Process.Start( "cmd.exe" );

我尝试的一切都完美无缺(在启动命令窗口时),但自动运行行为从未发生。

4

1 回答 1

2

我找到了。问题在于 Windows 如何在 64 位版本的操作系统中存储(和检索)注册表中的数据。我的代码很好。MSDN上的文章进行了一些详细介绍。从那篇文章:

在 64 位 Windows 上,部分注册表项分别为 32 位应用程序和 64 位应用程序存储,并使用注册表重定向器和注册表反射映射到单独的逻辑注册表视图,因为 64 位版本的应用程序可能使用与 32 位版本不同的注册表项和值。还有一些未重定向或反映的共享注册表项。

我的解决方案是将我的 AutoRun 密钥添加到:

HKLM\Software\Wow6432Node\Microsoft\Command Processor

真正让我感到高兴的是我以前遇到过这种情况。我很少与注册表傻瓜,我只是完全忘记了它。

于 2010-11-29T23:53:01.433 回答