.NET控制台输出和PSExec

时间:2014-09-30 12:22:10

标签: c# .net command-line psexec

我正在运行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时不一样?

2 个答案:

答案 0 :(得分:0)

ReadToEnd将等待进程退出。例如psExecFile中的Console.ReadLine()可能会阻止您的阅读。但是你可以得到已编写的流,

            StreamReader output = p.StandardOutput;
            string line;
            while ((line = output.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }

答案 1 :(得分:0)

在控制台中,写入StandardOutputStandardError的数据将显示在控制台中。

在你的程序中,你需要单独查看每个...尝试在最后添加这样的东西:

string error = p.StandardError.ReadToEnd();