2011-12-20 5 views
1

集中型デバイスで実行するための小さなプログラムを作成しようとしています。その後、解析、(文字列への出力をリダイレクトする必要があります)、リモートノードからのnetstatデータを収集するために、 "C#とpsexecのプロセス出力リダイレクトの問題

をLISTENING "|このプログラムは

" FINDSTRをPSEXECの\サーバー(複数可)は、netstat -na" を実行します既知のリストと比較することができます。上記のpsexec cmdをcmd行から問題なく実行できますが、C#プログラム内のプロセスと同じコマンドを実行しようとすると、解析されるデータは返されません。 netstatが実行されていることがわかります(cmdウィンドウがnetstatの結果で点滅します)が、process.standardoutputはストリームを捕まえていません。 pingを使用するか、psexec以外のものを引数として使用すると、ストリームが捕捉され、結果がテキストボックスに表示されます。また、ファイル名をpsexec.exeに設定して引数を指定しようとしましたが、同じ結果が得られました。最後に、引数なしでpsexecを実行すると、テキストボックスに返されたヘルプの情報が得られます。これは、ファイル名としてpsexec.exeを実行している場合、またはargsと指定された "/ c psexec"のファイル名としてcmd.exeを実行した場合に当てはまります。

私は、この時点でローカルで実行しているときに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"; 
     } 
+0

[BeginOutputReadLineのサンプルコードは参考になります](http://msdn.microsoft.com/en-us/library/system.diagnostics) .process.beginoutputreadline.aspx)。 –

答えて

2

は、ここでは、コードです。

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

+0

標準エラー出力もチェックします。 Psexecは32ビット(64ビットで動作します)で、VS10 C#Expressを使用しているので、プラットフォームを確認するのが難しくなっていますが、この場合は問題ではないと思います。マシン私はdev/debug/runningに32ビットを使用しています。 – JStillwell

+0

いくつかの変更が加えられましたが、標準エラー出力をキャプチャするのはお勧めできませんでした。資格情報を提供したい場合は、標準入力をキャッチする必要もあります。情報がエラー出力に送信されていたので、私はその時点でpsexecが出力を食べていないことを知っていました。リモートで実行するためのstrリテラルと資格情報を投げ捨て、完全に機能します。助けてくれてありがとう。ここに更新されたコードです: – JStillwell

2

変更する項目がいくつかありますが、標準エラー出力をキャプチャするのはお勧めできませんでした。私はその時点でpsexecがすべての出力を食べていないことを知っていたので、いくつかの情報がエラー出力に送信されていたことがわかります(実際にはエラーではなく、単にpsexecからステータス0を実行しています)。リモートホストをargsとして渡そうとすると、私はuser/passエラーデータを取得し始めました。また、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;