2011-01-28 53 views
7

我試圖通過命令提示符從ASP.Net Web應用程序運行命令。我可以在Web服務器上的任務管理器中看到該進程啓動,但是該進程只是坐在那裏,並且不會退出,也不會運行我指定的命令。當通過Process.Start()調用時,爲什麼「cmd.exe/C命令」不會結束?

  Process process = new Process(); 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 

      startInfo.FileName = "cmd.exe"; 
      startInfo.Arguments = "/C " +command; 
      startInfo.UserName = "myuser"; 
      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.Domain = "mydomain"; 
      startInfo.CreateNoWindow = true; 

      String pass = "mypass"; 
      System.Security.SecureString secPass = new System.Security.SecureString(); 

      foreach (char c in pass.ToCharArray()) 
      { 
       secPass.AppendChar(c); 
      } 
      secPass.MakeReadOnly(); 

      startInfo.Password = secPass; 

      process.StartInfo = startInfo; 
      process.Start(); 
      //output = process.StandardOutput.ReadToEnd(); 
      process.WaitForExit(); 
      process.Close(); 

我已經試過,沒有閱讀標準輸出。

應用程序將掛在process.WaitForExit();,直到我殺通過任務管理器的進程。

+2

如果您嘗試讀取標準輸出,您看過標準輸出是什麼?嘗試閱讀標準錯誤;你可能會得到某種錯誤信息,也許有人甚至會說「按任意鍵繼續...」,或者出現這種情況。 – GWLlosa 2011-01-28 16:58:27

+0

@GWLlosa,標準輸出和標準錯誤都是空的。我想到了「按任意鍵......」,所以我試着給標準輸入寫一個字符,但還是什麼都沒有。 – 2011-01-28 17:15:30

+2

爲什麼通過cmd運行它?爲什麼不直接運行它? – 2011-01-28 17:46:15

回答

2

我認爲,我們需要了解你實際上是試圖以過程來確定發生了什麼事情什麼命令。我們還需要知道服務器運行的是什麼操作系統。

例如,我沒有在您的意見看,你試過「echo測試> C:\ test.txt的」在Windows Server 2008中(和Windows 7)的根目錄需要管理員權限才能創建文件。如果這是在IIS下執行的,我的猜測是你的IIS用戶不是管理員,你正在獲得安全例外。

此外,由於UAC,許多命令可能需要提高權限。我不記得確切的,但我猜測,如果這些命令被UAC捕獲,那麼這個過程正在等待UAC確認...我認爲你不能通過命令行提供的。

如果您登錄到機器並直接執行它...除非你與工作進程的用戶帳戶登錄這類問題不會被看到。

所以,你需要做的第一件事情是弄清楚什麼是你正在嘗試運行,看看工作進程正在執行用戶甚至可以執行這些操作。安全是爲了保護你,所以要小心授予用戶額外的權限。

爲什麼它可能一臺機器上工作,與另一原因還是取決於操作系統的那些機器正在運行,並在命令下執行用戶的配置。

如果這是一個真正的安全問題,因爲我懷疑,那麼你應該張貼在serverfault.com一個問題要問你需要你的工作進程的用戶下執行各種命令什麼權限集。

您可以查看機器事件日誌以查看是否存在有關該命令的任何警告或錯誤。有時候,像這樣的事情可以在那裏顯示給你一些關於發生事情的更多信息。

1

一旦傳遞給CMD,控件就會傳遞給shell。這是更好地添加關閉它是這樣的:

private void closeSubProcess() 
    { 
     Process[] currentProcesses = Process.GetProcesses(); 
     foreach (Process p in currentProcesses) 
     { 
      string s = p.ProcessName; 
      s = s.ToLower(); 
      if (s.CompareTo("YOURPROGRAMNAMEHERE") == 0) 
      { 
       p.CloseMainWindow(); 
       p.Close(); 
      } 
     } 
    } 
0

我打電話給cmd.exe在Windows中啓動節點模塊。顯然必須首先安裝npm以及我需要的節點模塊,然後我可以用C#中的args調用模塊。問題是,cmd.exe不會關閉,我不得不使用任務管理器(就像這個問題!)。

 //This requires npm, and the module installed by npm... 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = "cmd.exe"; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.UseShellExecute = true; //closes command window 
     psi.Arguments = "/c <nodemodulename>" + file1 + ".txt " + file2 + ".log"; 
     Process p = Process.Start(psi); 
     p.Close(); 

/c參數是關閉cmd.exe的關鍵。當我開始的時候,我已經輸入了/K的論點,這個論證保持了一件令人頭疼的事情。解決了。希望這可以幫助。(這是古代的,但我們總是忘記)

相關問題