Я запускаю инструмент PSExec Microsoft с классом Process, выполняющим удаленную команду с собственным выходом следующим образом:
Process p = new Process();
string args = @"\\remotemachine -u someuser -p somepass wmic product get name";
ProcessStartInfo ps = new ProcessStartInfo();
ps.Arguments = args;
ps.FileName = psExecFileName;
ps.UseShellExecute = false;
ps.CreateNoWindow = true;
ps.RedirectStandardOutput = true;
ps.RedirectStandardError = true;
p.StartInfo = ps;
p.Start();
StreamReader output = p.StandardOutput;
string output = output.ReadToEnd();
где wmic product get name - это инструмент WMI, работающий удаленно с собственным выходом, перечисляющим все установленные приложения на удаленном компьютере. Таким образом, на выходе я не вижу выход wmic, в то время как я запускаю PSExec в командной строке локально, я могу полностью видеть вывод обоих PSExec и запускать удаленно WMIC. Вопрос в том, как я могу захватить весь вывод на локальном компьютере? Должен ли я запускать его в отдельной консоли и пытаться подключиться к консоли, чтобы захватить весь вывод?
В более общем плане, если ясно, почему вывод в процессе StandardOutput и в консоли при запуске PSExec напрямую не то же самое?
В консоли на консоли отображаются данные, записанные как в StandardOutput
и в StandardError
.
В рамках вашей программы вам нужно посмотреть каждый отдельно... попробуйте добавить что-то вроде этого в конце:
string error = p.StandardError.ReadToEnd();
ReadToEnd
будет ждать завершения процесса. например, Console.ReadLine()
в psExecFile может блокировать чтение. Но вы можете получить уже написанный поток,
StreamReader output = p.StandardOutput;
string line;
while ((line = output.ReadLine()) != null)
{
Console.WriteLine(line);
}
output.ReadLine()
является нулевым, когда достигнут конец входного потока.