2014-01-23 3 views
1

У меня есть программа на C++, которая работает как служба на 64-разрядной машине Windows Server 2008. Эта программа пытается запустить пакетный файл с помощью следующей команды:Почему я не могу запустить пакетный файл из службы с помощью system() в Windows Server 2008?

system(C:\pathtofile\file.bat) 

В 32-разрядной Windows Server 2003 это работало нормально (пакетный файл был выполнен), а на Windows Server 2008 пакетный файл не выполняется и Я получаю возвращаемое значение 0xC0000142 (у меня был пакетный файл, который написал какой-то текст в файл в качестве теста, чтобы убедиться, что он выполнен). Я получаю такое же возвращаемое значение, даже если я пытаюсь выполнить что-то, что не существует.

Я прочитал о Session 0 изоляции в Windows Server 2008, так что я использовал PsExec для запуска командной строки в сеансе 0, как тот же пользователь домена, который указан как «Log On As» пользователя для службы:

psexec -i 0 -u DOMAIN\serviceuser -p passwd cmd.exe 

Тогда я смог успешно выполнить командный файл из командной строки.

Пользователь домена, который указан как пользователь для входа в систему, находится в группе «Администраторы». Также, если я запускаю приложение C++ вручную (а не как сервис), он запустит командный файл.

Итак, есть что-то в изоляции сеанса 0, которая заставляет вызов system() работать при запуске службы? Или какое-то другое объяснение изменения поведения? Я знаю, что система() не всегда является лучшим способом сделать это в любом случае, но я ищу фактическую причину, по которой это больше не работает.

+0

Это поможет узнать, что пытается сделать пакетный файл. –

+0

Поскольку это (предположительно) 32-разрядная программа, вызов 'system' будет запускать 32-разрядную версию' cmd.exe'. Проверьте, правильно ли выполняется 'c: \ windows \ syswow64 \ cmd.exe'. –

+0

Если вы можете добавить регистрацию в службу, проверьте, установлены ли переменные среды 'COMSPEC' и' PATH'. Монитор процессов (доступный с веб-сайта MS) также может дать вам некоторые подсказки относительно того, что происходит. –

ответ

1

Из-за того, что я сейчас понимаю о проблеме, причина, по которой вы не можете запустить пакетный файл из службы с помощью system() в Windows Server 2008, связана с тем, что Windows рассматривает любую попытку вызвать cmd.exe (например, для запуска вашего пакетного файла) в качестве попытки запуска интерактивной службы. Из-за изоляции сеанса 0 это недопустимо и будет просто терпеть неудачу, даже если вы можете не думать о том, что ваш командный файл является интерактивным или иметь графический интерфейс (который меня отбрасывал).

Я понял, как получить эффект, который я искал, используя CreateProcess. Ключ здесь состоит в том, что вы должны установить параметр dwCreationFlags в CREATE_NO_WINDOW. Таким образом, мой (упрощенный) звон выглядел примерно так:

CreateProcess(NULL, // No module name (use command line) 
    L"C:\\Windows\\System32\\cmd.exe /C myfile.bat", // Call cmd.exe with /C flag 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    FALSE,   // Set handle inheritance to FALSE 
    CREATE_NO_WINDOW,    // Use CREATE_NO_WINDOW!!! 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &si,   // Pointer to STARTUPINFO structure 
    &pi)   // Pointer to PROCESS_INFORMATION structure 

 Смежные вопросы

  • Нет связанных вопросов^_^