У меня есть программа на 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() работать при запуске службы? Или какое-то другое объяснение изменения поведения? Я знаю, что система() не всегда является лучшим способом сделать это в любом случае, но я ищу фактическую причину, по которой это больше не работает.
Это поможет узнать, что пытается сделать пакетный файл. –
Поскольку это (предположительно) 32-разрядная программа, вызов 'system' будет запускать 32-разрядную версию' cmd.exe'. Проверьте, правильно ли выполняется 'c: \ windows \ syswow64 \ cmd.exe'. –
Если вы можете добавить регистрацию в службу, проверьте, установлены ли переменные среды 'COMSPEC' и' PATH'. Монитор процессов (доступный с веб-сайта MS) также может дать вам некоторые подсказки относительно того, что происходит. –