C#和psexec处理输出重定向问题

时间:2011-12-20 23:38:27

标签: c# system.diagnostics psexec netstat

我正在尝试创建一个在集中设备上运行的小程序。该程序将运行

  

“psexec \ server(s)netstat -na | findstr”LISTENING“”

从远程节点收集netstat数据(应将输出重定向到字符串),然后解析数据并与已知列表进行比较。我可以在cmd行没有任何问题的情况下运行上面的psexec cmd,但是当我尝试在C#程序中运行与进程相同的命令时,不会返回任何数据进行解析。我可以看到正在运行netstat(带有netstat结果的cmd窗口闪烁),但是process.standardoutput没有捕获流。如果我使用ping或除了psexec之外的其他任何东西作为参数,则捕获流并且结果显示在我的文本框中。我也尝试将文件名设置为psexec.exe并指定参数,但我得到相同的结果。最后但并非最不重要的是,如果我在没有任何参数的情况下运行psexec,我会在文本框中返回帮助回扣信息。如果我正在运行psexec.exe作为文件名,或者如果我将cmd.exe作为文件名运行,并将“/ c psexec”指定为args,则为真。

我只是想在此时执行本地执行时捕获psexec输出。我稍后会担心psexec到远程机器。任何帮助都会非常感激。

以下是代码:

        System.Diagnostics.Process pProcess = new System.Diagnostics.Process();  
        pProcess.StartInfo.FileName = "cmd.exe";  
        pProcess.StartInfo.Arguments = "/c psexec netstat";  
        pProcess.StartInfo.UseShellExecute = false;  
        pProcess.StartInfo.RedirectStandardOutput = true;     
        pProcess.Start();
        string strOutput = pProcess.StandardOutput.ReadToEnd(); 
        pProcess.WaitForExit();

        if (pProcess.HasExited)
        {
            textBox1.Text = strOutput;
        }
        else
        {
            textBox1.Text = "TIMEOUT FAIL";
        }

2 个答案:

答案 0 :(得分:3)

我建议还要捕获标准错误输出,以防有任何报道。

此外,如果您在64位操作系统上运行,则可能会将psexec的“位数”与您的应用程序断开连接。如果是这种情况,请更改项目的平台以匹配psexec的平台,而不是构建为任何CPU。

答案 1 :(得分:2)

遇到了一些需要改变的事情,但是您对捕获标准错误输出的建议已经过时并且是一个良好的开端。原来一些信息被发送到错误输出(即使真的不是错误,只是从psexec运行状态0)所以我知道那时psexec不只是吃掉所有的输出。一旦我开始尝试将远程主机作为args传递,我就开始收回用户/传递错误数据。如果我想为proc运行提供凭证,还需要捕获标准输入。为远程执行程序提供了一些str文字和凭据,完美地运行。谢谢您的帮助。这是更新的代码 -

        System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
        pProcess.StartInfo.Domain = "domain";
        pProcess.StartInfo.UserName = "user with priv";
        pProcess.StartInfo.Password = new System.Security.SecureString();
        char [] pass = textBox3.Text.ToArray();
        for (int x = 0; x < pass.Length; ++x)
        {
            pProcess.StartInfo.Password.AppendChar(pass[x]);
        }
        pProcess.StartInfo.FileName = @"psexec.exe";
        pProcess.StartInfo.Arguments = @"\\remoteHost netstat -ano";
        pProcess.StartInfo.UseShellExecute = false;
        pProcess.StartInfo.RedirectStandardInput = true;
        pProcess.StartInfo.RedirectStandardOutput = true;
        pProcess.StartInfo.RedirectStandardError = true;
        pProcess.Start();
        pProcess.WaitForExit(30000);
        if (!pProcess.HasExited)
        {
            pProcess.Kill();
        }

        string strOutput = pProcess.StandardOutput.ReadToEnd();
        string errOutput = pProcess.StandardError.ReadToEnd();
        textBox1.Text = strOutput;
        textBox2.Text = errOutput;