1

一元化されたデバイスで実行する小さなプログラムを作成しようとしています。このプログラムは実行されます

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

リモートノードからnetstatデータを収集し(出力を文字列にリダイレクトする必要があります)、データを解析して既知のリストと比較します。psexec上記のcmdは、cmd行から問題なく実行できますが、C#プログラム内のプロセスと同じコマンドを実行しようとすると、解析対象のデータが返されません。が実行されていることはわかりますnetstatが(cmdウィンドウがnetstatの結果とともに点滅します)、process.standardoutputがストリームをキャッチしていません。pingまたはそれ以外のものを使用する場合psexec引数として、ストリームがキャッチされ、結果がテキストボックスに表示されます。また、ファイル名をpsexec.exeに設定して引数を指定しようとしましたが、同じ結果が得られます。最後になりましたが、引数なしでpsexecを実行すると、テキストボックスにヘルプキックバック情報が返されます。これはpsexec.exe、ファイル名として実行している場合、またはcmd.exe「/cpsexec」を。として指定してファイル名として実行している場合に当てはまります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";
        }
4

2 に答える 2

3

そこに何かが報告されている場合に備えて、標準エラー出力もキャプチャすることをお勧めします。

また、64 ビット OS で実行している場合は、psexec の「ビット数」とアプリケーションが切断されている可能性があります。この場合は、プロジェクトのプラットフォームを任意の CPU としてビルドするのではなく、psexec のプラットフォームと一致するように変更します。

于 2011-12-20T23:45:56.097 に答える
2

変更すべき点がいくつかありましたが、標準エラー出力をキャプチャするというあなたの推奨事項は完全に有効であり、良いスタートを切りました。いくつかの情報がエラー出力に送信されていたことがわかりました(実際にはエラーではありませんでしたが、psexecからステータス0を実行するだけです)、その時点でpsexecがすべての出力を食べているだけではないことがわかりました。リモートホストを引数として渡そうとすると、ユーザー/パスエラーデータが返され始めました。また、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;
于 2011-12-22T16:46:31.443 に答える