2015-11-04 37 views
1

我正在製作一個應用程序,它允許客戶端在對話框中列出其所有正在運行的進程。我目前有下面的代碼,我無法弄清楚爲什麼它不工作。C#無法捕獲輸出當以其他用戶身份運行時

我沒有看到任何輸出,無論是sderr還是stdout。有人可以請指點我正確的方向嗎?

非常感謝

private void button1_Click(object sender, EventArgs e) 
    { 

     string test = " "; 

     var ss = new SecureString(); 
     ss.AppendChar('T'); 
     ss.AppendChar('a'); 
     ss.AppendChar('k'); 
     ss.AppendChar('e'); 
     ss.AppendChar('c'); 
     ss.AppendChar('a'); 
     ss.AppendChar('r'); 
     ss.AppendChar('e'); 
     ss.AppendChar('9'); 
     ss.AppendChar('9'); 
     ss.MakeReadOnly(); 

     var serverName = "SERVER-NAME"; 
     var sessionID = "2"; 
     var PID = "6816"; 

     ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/C tasklist /S " + serverName + " /FI \"SESSION eq " + sessionID + "\" >C:\\users\\test.account\\desktop\\NEWEWE.txt") 
     { 
      WorkingDirectory = @"C:\windows\system32", 
      Verb = "runas", 
      Domain = "BARDOM1", 
      UserName = "XATest", 
      Password = ss, 

      WindowStyle = ProcessWindowStyle.Hidden, 
      UseShellExecute = false, 
      RedirectStandardOutput = true, 
      CreateNoWindow = true 
     }; 

     Process proc = Process.Start(startInfo); 
     proc.OutputDataReceived += (x, y) => test += (y.Data); 
     proc.BeginOutputReadLine(); 
     proc.WaitForExit(); 

     MessageBox.Show(test); 
     MessageBox.Show("done"); 

我試圖重定向輸出設置爲真與假,我已經嘗試設置> C:......在各種性質的CMD命令,但看不到任何輸出。

任何幫助,這是非常感謝! 非常感謝

+0

可能沒有輸出,因爲該命令被重定向到一個文件。如果你把它改成'新的ProcessStartInfo(「cmd」,「/ C任務列表/ S」+ serverName +「/ FI \」SESSION eq「+ sessionID)'它是否有效? – theB

+0

嗨,B,不僅你是對的,服務器還需要重新設置,以便XAtest可以重新獲得他們的管理權限! – Bassie

+0

我將在幾分鐘內將該評論擴展爲實際的答案 – theB

回答

0

問題是命令行指定輸出應該到文件。我還建議使用StringBuilder來收集輸出。這比連接+=的字符串更有效率。

下面是一個顯示工作版本的示例,後面是顯示您所看到的行爲的版本。

StringBuilder test = new StringBuilder(); 

// Not redirected 
ProcessStartInfo psi = new ProcessStartInfo("cmd", "/c echo yes") 
{ 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    CreateNoWindow = true 
}; 

Process proc = Process.Start(psi); 
proc.OutputDataReceived += (x, y) => test.Append(y.Data); 
proc.BeginOutputReadLine(); 
proc.WaitForExit(); 

Console.WriteLine(test.ToString()); // Output: yes 

test.Clear(); 

// Redirected 
psi = new ProcessStartInfo("cmd", "/c echo yes > NUL") 
{ 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    CreateNoWindow = true 
}; 

proc = Process.Start(psi); 
proc.OutputDataReceived += (x, y) => test.Append(y.Data); 
proc.BeginOutputReadLine(); 
proc.WaitForExit(); 

Console.WriteLine(test.ToString()); // Blank line 
+0

謝謝! 和甜美的個人照片,愛那個故事 – Bassie

相關問題