用C#重定向进程的标准输出(Permissiong bug)

时间:2015-08-17 14:49:47

标签: c# visual-studio-2013 output psexec

我在C#(WPF)中编写了一个应用远程主机数据的应用程序(使用Psexec)。

该应用要求您具有高权限(管理员)。

我的应用中有这种代码:

var proc = new Process {
    StartInfo = new ProcessStartInfo {
        FileName = "psexec.exe",
        Arguments = "\\\\" + ip + " ipconfig",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    }
};
proc.Start();
if (!proc.WaitForExit(60000))
    proc.Kill();
output_error = proc.StandardError.ReadToEnd();
output_stan = proc.StandardOutput.ReadToEnd();

如果我从Visual Studio运行应用程序(在调试模式下),我会得到一个输出,但是当我从exe文件运行应用程序时,标准的重定向输出只是空的。 / p>

有没有人可以解决这个问题?

*作为错误重定向的输出是一个standrad psexec输出,它基本上说该命令只能找到(错误0)。

THX。

1 个答案:

答案 0 :(得分:0)

来自MSDN:

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();

// To avoid deadlocks, always read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

特别注意在阅读流之前你不应该等待,否则你可能会遇到死锁。

我已修改您的代码以这种方式执行,以下工作正常对我来说:

    static void Main(string[] args)
    {
        var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "ping.exe",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true
            }
        };
        proc.Start();
        string output_error = proc.StandardError.ReadToEnd();
        string output_stan = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();

        Trace.TraceInformation(output_stan);
    }