Проблемы с запуском процесса PsExec из кода - PullRequest
4 голосов
/ 25 июля 2011

Я испытываю странную проблему при попытке запустить инструмент командной строки .NET удаленно, используя PsExec.

  1. При запуске PsExec из командной строки он запускается и нормально завершается.

  2. При запуске из консольного приложения (создание процесса, запуск PsExec.exe с необходимыми аргументами) - он работает нормально.

  3. При запуске из нашего собственного пользовательского инструмента, который используется для выполнения различных задач, он либо прерывается, либо не завершается успешно.

Вот код, который я использую:

Process p = new Process();

p.StartInfo.FileName = @"C:\PsExec.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

string arg = "-snapshot -display C:\*.msi -s";

p.StartInfo.Arguments = @"\\10.161.203.106 -u user -p pwd -cf C:\FVT.exe " + arg;

Logger.Info(this, "Starting process");

p.Start();
var ended = p.WaitForExit(60 * 1000);

if (!ended)
{
    throw new Exception("Process timed out.");
}

Logger.Info(this, "Process ended");

using (StreamReader sr = p.StandardOutput)
{
    string buffer = sr.ReadToEnd();
    Logger.Info(this, buffer);
}

Этот код работает нормально из строки cmd или из отдельного приложения!

Я не знаю, что здесь может быть не так.

Наш внутренний инструмент появляетсяновый поток и запускает этот код в нем.

Обновление:

командная строка + аргументы в окне командной строки - работает.Те же команды cmd +, запускаются как процесс с RedirectOutput - останавливается и возвращается по таймауту.

Может ли это быть ошибкой в ​​.NET?(это происходит для других программ, командных файлов и т. д.).

Ответы [ 2 ]

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

попробуйте добавить -accepteula к своим аргументам в psexec

2 голосов
/ 25 июля 2011

Я не знаю, в чем ошибка , но у меня есть догадка, что если вы перенаправите stderr (RedirectStandardError = true) и прочитаете поток stderr (как вы делаете с stdout), он скажет вам , В качестве альтернативы, во время отладки оставьте CreateNoWindow = false и, возможно, вы увидите сообщение консоли (особенно, если оно ожидает нажатия клавиши; в противном случае оно может исчезнуть слишком быстро, чтобы заметить).

Обратите внимание, что вам может потребоваться настроить асинхронные программы чтения на stdout / stderr, если процесс не завершается. Вы можете сделать это либо в дополнительных потоках, либо с помощью событий OutputDataReceived / ErrorDataReceived (вам также необходимо установить EnableRaisingEvents в true).


Если это все еще не работает; Вы можете попробовать запустить с UseShellExecute=true. Это означает, что вы не сможете перенаправить ввод-вывод, поэтому вам, возможно, придется использовать > / >> и т. Д., Чтобы передать вывод в файл (в идеале в temp), а затем прочитать файл.

...