Запуск PsExec из IIS: PsExecSVC висит на удаленном хосте - PullRequest
2 голосов
/ 05 февраля 2011

Я пытаюсь запустить файл .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.

1 Ответ

3 голосов
/ 04 сентября 2012

Вероятно, проблема заключается в том, что PSExecSvc на вашем удаленном хосте (novi2) не очистил после себя, и теперь его необходимо удалить, прежде чем он сможет успешно работать. Теперь я добавляю следующее в конце каждого сценария, который запускает PSExec для удаленного хоста:

sc \\novi2 delete PSExecSvc

Кроме того, если вы создаете экземпляр PSExec на , а не против удаленного хоста, то вам необходимо убедиться, что вы добавили коммутатор для принятия его EULA следующим образом:

psexec \\HOST1 /accepteula -u userid -p password COMMAND

Надеюсь, это поможет, Lizz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...