2011-12-20 55 views
1

我試圖創建一個小程序在集中式設備上運行。該程序將運行C#和psexec進程輸出重定向問題

「PSEXEC \服務器(S)的netstat -na | FINDSTR 」聽「」

從遠程節點採集數據的netstat(應該重定向輸出字符串),然後解析數據並與已知列表進行比較。我可以運行上面的cmdd psexec,而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"; 
     } 
+0

你可能會[找到'BeginOutputReadLine'示例代碼爲您提供幫助(http://msdn.microsoft.com/en-us/library/system.diagnostics .process.beginoutputreadline.aspx)。 – 2011-12-20 23:53:27

回答

2

我會建議也捕捉任何情況下的標準錯誤輸出被報道出現。

此外,如果您在64位操作系統上運行,您可能會在psexec的「位」與您的應用程序之間斷開連接。如果是這種情況,請將項目的平臺更改爲與psexec相匹配,而不是構建爲任何CPU。

+0

也將檢查標準錯誤輸出。 Psexec是32位(將工作在64位),並且由於我使用的是VS10 C#Express,所以我在確認平臺時遇到了困難,但我認爲在這種情況下應該沒有關係。我用來開發/調試/運行的機器是32位。 – JStillwell 2011-12-21 21:07:11

+0

遇到了一些需要改變的地方,但是您關於捕獲標準錯誤輸出的建議已經過時並且是一個好的開始。如果我想提供證書,還需要捕獲標準輸入。原來,信息被髮送到錯誤輸出,所以我知道在這一點上,psexec不只是吃掉輸出。投入一些文字和證書來遠程運行,完美運作。謝謝您的幫助。這裏是更新後的代碼: – JStillwell 2011-12-22 16:29:15

2

遇到了一些需要更改的內容,但是您對捕獲標準錯誤輸出的建議已經過時並且是一個好的開始。結果發送了一些信息給錯誤輸出(儘管確實沒有錯誤,只是從psexec運行狀態0),所以我知道在這一點上,psexec不只是吃掉所有的輸出。一旦我開始嘗試將遠程主機作爲參數傳遞,我開始獲取用戶/傳遞錯誤數據。如果我想爲proc run提供證書,還需要捕獲標準輸入。爲遠程執行官提供了一些文字和證書,完美地工作。謝謝您的幫助。這裏是更新代碼 -

 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;