Проблемы с запуском процесса PsExec из кода
-
25-10-2019 - |
Вопрос
Я сталкиваюсь со странной проблемой при попытке удаленного запуска инструмента командной строки .NET с помощью PsExec.
При запуске PsExec из командной строки он запускается и завершается нормально.
При запуске из консольного приложения (создание процесса, запуск PsExec.exe с необходимыми аргументами для него) - выполняется нормально.
При запуске из нашего собственного пользовательского инструмента, который используется для выполнения различных задач, время ожидания истекает или оно не выполняется завершается успешно.
Вот код, который я использую:
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 + args, запускается как процесс с RedirectOutput - останавливается и возвращается по таймауту.
Может ли это быть ошибкой в .NET?(это происходит для других программ, пакетных файлов и т.д.).
Решение
Я не знаю, в чем ошибка является, но у меня есть предчувствие , что если вы перенаправите stderr (RedirectStandardError = true
) и прочитайте поток stderr (как вы делаете со стандартным выводом), он вам подскажет.В качестве альтернативы, во время отладки оставьте CreateNoWindow = false
и, возможно, вы увидите сообщение консоли (особенно если оно ожидает нажатия клавиши;в противном случае он может исчезнуть слишком быстро, чтобы его можно было заметить).
Обратите внимание, что вам может потребоваться настроить асинхронные считыватели в stdout / stderr, если процесс не завершается.Вы можете сделать это либо с помощью дополнительных потоков, либо с помощью OutputDataReceived
/ ErrorDataReceived
события (вам необходимо установить EnableRaisingEvents
Для true
также).
Если это все еще не работает;ты мог бы попробовать бегать с UseShellExecute=true
.Это означает, что вы не сможете перенаправить ввод-вывод, поэтому вам, возможно, придется использовать >
/ >>
etc, чтобы передать выходные данные в файл (в идеале во временном формате), затем прочитайте файл.
Другие советы
попробуйте добавить -accepteula к вашим аргументам в psexec