Я пытаюсь запустить файл .bat на удаленном хосте с веб-страницы.
PSEXECSVC (на хосте) зависает и не закрывается после выполнения пакета, в результате чего сервер ожидает бесконечно долго.
При запуске точно такого же кода (см. Внизу) в консольном приложении служба закрывается, и все в порядке ...
Странная часть - это когда пакетный файл состоит из одного эхосигнала:
@echo off
echo ------ Start -----
exit
PsExecSvc закроется, и на странице отобразится "------ Start -----"
.(Это то, что я хочу ..)
С другой стороны,
@echo off
echo ------ Start -----
echo echo2
exit
PSEXECSVC будет зависать в конце выполнения ...
При ручном уничтожении PSEXECSVC, только "------ Start -----"
показывает и печатает StdErr:
PsExec v1.98 - выполняет процессы удаленно
Copyright (C) 2001-2010 Марк Руссинович
Sysinternals -www.sysinternals.com
Недопустимый дескриптор.
Подключение к novi2 ...
Запуск службы PsExec на novi2 ...
Подключение кСлужба PsExec на novi2 ...
Запуск C: /dbInfo.bat на novi2 ...
Ошибка связи со службой PsExec на novi2:
Неважночто запускается в пакетном файле, перенаправляется только первая строка StdOut и psexecsvc зависает (но после выполнения всего пакета: O).
Если выполняется:
info.bat:
@echo off
cscript /nologo test.vbs
exit
test.vbs:
Set objOut = Wscript.StdOut
objOut.WriteLine "----------------------------------"
objOut.Writeline "Win32_OperatingSystem instance"
objOut.Writeline "----------------------------------"
objOut.close
Wscript.quit 666
Приложение Console напечатает все и вернет 666
IIS получит только"----------------------------------" в StdOut и psexecsvc будет зависать ...
Вот код, используемый для запуска psexec в C # ...
Process proc = new Process();
ProcessStartInfo procInfo = new ProcessStartInfo(@"C:/PsExec.exe", @"\\novi2 -u Domain\usernameadmin -p Password C:/info.bat");
procInfo.UseShellExecute = false;
procInfo.RedirectStandardOutput = true;
procInfo.RedirectStandardError = true;
proc.StartInfo = procInfo;
proc.Start();
String output = proc.StandardOutput.ReadToEnd();
String err = proc.StandardError.ReadToEnd();
Trace.WriteLine("Out >> " + output);
Trace.WriteLine("Err >> " + err);
proc.Close();
Я использую IIS 7, ASP MVC3 и .NET4.0 на сервере (примеры проектов из VS2010) и WinXP SP3 дляхост.Чтобы избежать проблем, ApplicationPool в IIS использует ту же учетную запись администратора, что и psexec.