Проблема
Выполнение PSExec как процесса из C# с включенным асинхронным перенаправлением Обработчики событий, полученные моими данными, никогда не вызываются.
Контекст
У меня есть приложение С#, предназначенное для подключения и управления подчиненным приложением на нескольких других компьютерах в той же локальной сети. И основное приложение, и подчиненные приложения являются приложениями Windows Forms. Одной из функций моего приложения является возможность удаленного запуска ведомого приложения. Поскольку это требует некоторого времени, я надеялся использовать вывод PSexec, чтобы показать, что что-то действительно происходит. Ниже приведен код, который я использую для запуска удаленного приложения.
ProcessStartInfo start = new ProcessStartInfo();
start.CreateNoWindow = true;
start.RedirectStandardError = true;
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.UseShellExecute = false;
start.WorkingDirectory = System.Windows.Forms.Application.StartupPath + "\\PSTools\\";
start.FileName = start.WorkingDirectory + "PsExec.exe";
start.Arguments = "\\\\" + ComName + " -u \"" + UserName + "\" -p \"" + Password +
"\" -i -w " + RemoteDrectory + "\" \"" + RemoteDrectory + "\\" + ApplicationName + "\"";
try
{
if (proc != null)
{
if (proc.HasExited == false)
{
proc.Kill();
proc.Close();
}
proc.Dispose();
proc.OutputDataReceived -= ProcDataReceaved;
proc.ErrorDataReceived -= ProcDataReceaved;
}
proc = new Process();
proc.EnableRaisingEvents = true;
proc.OutputDataReceived += new DataReceivedEventHandler(ProcDataReceaved);
proc.ErrorDataReceived += new DataReceivedEventHandler(ProcErrorReceaved);
proc = Process.Start(start);
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
}
catch(Exception e)
{
Console.WriteLine("An error occurred while launching slave application\r\n" + e.ToString());
}
На самом деле это имеет желаемый эффект запуска подчиненного приложения на удаленной машине без проблем. Кроме того, если я отключу перенаправление вывода, консоль покажет следующее:
PsExec v2.2 - Удаленное выполнение процессов Copyright (C) 2001-2016 Марк Руссинович Sysinternals - www.sysinternals.com
Запуск службы PSEXESVC на ComName...
Последняя строка удаляется после установления соединения. Если это важно сейчас, обработчики событий определены следующим образом:
public void ProcDataReceaved(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Data Received from process\r\n" + e.Data);
}
public void ProcErrorReceaved(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Data Received from process\r\n" + e.Data);
}
Необязательная цель
Ожидается, что ведомое приложение не будет иметь много вывода на консоль. Но, если бы я мог подготовить любой вывод от ведомого через вывод PSexec, это было бы мило.
Потенциальный потенциальный клиент 08.03.17
Сегодня я разговаривал с представителями по адресу https://www.poweradmin.com/paexec/. , в частности представитель по имени Дэвид. Там версия PSExec (PAExec) использует команды WriteConsole для записи вывода, который я пытаюсь получить. Таким образом, этот вывод не записывается ни в stderr, ни в stdout, а напрямую в экранный буфер консоли. Очевидно, это ни о чем не говорит PSExec, так как они не одни и те же люди. Но это предполагает, что это потенциально моя проблема. Если это так, мне нужен другой способ отслеживать процесс подключения.