Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和psexec进程输出重定向问题_C#_System.diagnostics_Psexec_Netstat - Fatal编程技术网

C#和psexec进程输出重定向问题

C#和psexec进程输出重定向问题,c#,system.diagnostics,psexec,netstat,C#,System.diagnostics,Psexec,Netstat,我正在尝试创建一个在集中式设备上运行的小程序。此程序将运行 psexec\server)netstat-na | findstr“正在侦听” 要从远程节点收集netstat数据(应将输出重定向到字符串),请解析数据并与已知列表进行比较。我可以运行上面的psexeccmd,而不会在cmd行出现任何问题,但是当我尝试运行与我的C#程序中的进程相同的命令时,不会返回任何数据进行解析。我可以看到netstat正在运行(cmd窗口闪烁netstat结果),但是process.standardoutput没

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

psexec\server)netstat-na | findstr“正在侦听”

要从远程节点收集netstat数据(应将输出重定向到字符串),请解析数据并与已知列表进行比较。我可以运行上面的
psexec
cmd,而不会在cmd行出现任何问题,但是当我尝试运行与我的C#程序中的进程相同的命令时,不会返回任何数据进行解析。我可以看到
netstat
正在运行(cmd窗口闪烁netstat结果),但是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";
        }

我还建议捕获标准错误输出,以防报告任何错误


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

我还建议捕获标准错误输出,以防报告任何错误


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

遇到了一些需要更改的内容,但您关于捕获标准错误输出的建议已经过时,这是一个良好的开端。结果是一些信息被发送到了错误输出(尽管实际上不是错误,只是从psexec运行状态0),所以我知道psexec当时并不是在吃掉所有的输出。一旦我开始尝试将远程主机作为args传递,我就开始返回用户/传递错误数据。如果我想为proc运行提供凭据,还需要捕获标准输入。为远程执行程序添加了一些str文本和凭据,效果非常好。谢谢你的帮助。这是更新后的代码--

System.Diagnostics.Process pProcess=新的System.Diagnostics.Process();
pProcess.StartInfo.Domain=“域”;
pProcess.StartInfo.UserName=“具有权限的用户”;
pProcess.StartInfo.Password=new System.Security.SecureString();
char[]pass=textBox3.Text.ToArray();
对于(int x=0;x
遇到了一些需要更改的内容,但您关于捕获标准错误输出的建议是完全正确的,这是一个良好的开端。结果是一些信息被发送到了错误输出(尽管实际上不是错误,只是从psexec运行状态0),所以我知道psexec当时并不是在吃掉所有的输出。一旦我开始尝试将远程主机作为args传递,我就开始返回用户/传递错误数据。如果我想为proc运行提供凭据,还需要捕获标准输入。为远程执行程序添加了一些str文本和凭据,效果非常好。谢谢你的帮助。这是更新后的代码--

System.Diagnostics.Process pProcess=新的System.Diagnostics.Process();
pProcess.StartInfo.Domain=“域”;
pProcess.StartInfo.UserName=“具有权限的用户”;
pProcess.StartInfo.Password=new System.Security.SecureString();
char[]pass=textBox3.Text.ToArray();
对于(int x=0;x
您可能会。您可能会。您还将检查标准错误输出。Psexec是32位的(将在64位上工作),由于我使用的是VS10 C#Express,我在确认平台时遇到了困难,但我认为在这种情况下,这不重要。我用来开发/调试/运行的机器是32位的。遇到了一些需要更改的东西,但您的建议是
        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;