Вопрос

Я сталкиваюсь со странной проблемой при попытке удаленного запуска инструмента командной строки .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 + args, запускается как процесс с RedirectOutput - останавливается и возвращается по таймауту.

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

Это было полезно?

Решение

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

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


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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top