Проблема с запуском cmd.exe

В Windows при открытии командной строки (cmd.exe) ключи реестра:

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

проверяются на значение, называемое «AutoRun». Если найден, пакетный файл, указанный в значении, выполняется, обеспечивая функциональность, подобную autoexec. Если оба ключа содержат значения 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" );

Все, что я пытаюсь, работает отлично (в этом командном окне запускается), но поведение автозапуска никогда не происходит.


person BillP3rd    schedule 28.11.2010    source источник
comment
Где код, который проверяет реестр?   -  person bitxwise    schedule 28.11.2010
comment
Работает, проблем в коде не нашел   -  person Javed Akram    schedule 28.11.2010
comment
если вы поставили свой автозапуск только в ключ HKLM, ваша проблема может быть в виртуализации. Вы положили что-то в HKCU и ничего не получили? Кроме того, вы тестировали это, запуская командные строки вручную, чтобы вы знали, что единственная проблема заключается в том, как ваш код запускает их?   -  person Kate Gregory    schedule 28.11.2010


Ответы (1)


Я нашел это. Проблема заключалась в том, как Windows хранит (и извлекает) данные из реестра в 64-битных версиях операционной системы. Мой код был в порядке. статья на MSDN содержит некоторые подробности. Из той статьи:

В 64-разрядной версии Windows части записей реестра хранятся отдельно для 32-разрядных приложений и 64-разрядных приложений и отображаются в отдельные логические представления реестра с помощью перенаправителя реестра и отражения реестра, поскольку 64-разрядная версия приложения может использовать ключи и значения реестра отличаются от 32-разрядной версии. Существуют также общие ключи реестра, которые не перенаправляются и не отражаются.

Решение для меня состояло в том, чтобы добавить мой ключ автозапуска в:

HKLM\Software\Wow6432Node\Microsoft\Command Processor

Что действительно меня бесит, так это то, что я уже сталкивался с этим раньше. Я так редко заморачиваюсь с реестром, что просто про него совсем забыл.

person BillP3rd    schedule 29.11.2010