2010-05-11 49 views
6

我從ASP.NET運行外部程序:.NET 4:使用的Process.Start憑證返回空輸出

var process = new Process(); 
var startInfo = process.StartInfo; 

startInfo.FileName = filePath; 
startInfo.Arguments = arguments; 

startInfo.UseShellExecute = false; 
startInfo.RedirectStandardOutput = true; 
//startInfo.RedirectStandardError = true; 

process.Start(); 

process.WaitForExit(); 

Console.Write("Output: {0}", process.StandardOutput.ReadToEnd()); 
//Console.Write("Error Output: {0}", process.StandardError.ReadToEnd()); 

一切工作正常使用此代碼:外部程序執行和過程。 StandardOutput.ReadToEnd()返回正確的輸出。

但是在我以前的Process.Start()(運行在另一個用戶帳戶的上下文中,程序)添加以下兩行:

startInfo.UserName = userName; 
startInfo.Password = securePassword; 

未執行的程序和過程。 StandardOutput.ReadToEnd()返回一個空字符串。沒有例外被拋出。

的userNamesecurePassword是正確的(在不正確的憑據的情況下拋出一個異常)。

如何在另一個用戶帳戶的上下文中運行程序?

環境: .NET 4,Windows Server 2008的32位

UPD:

應用程序工作在ASP.NET開發服務器+ Windows 7的罰款,但沒有對IIS 7 +的Windows Server 2008 Web Edition。

UPD2:

錯誤的應用程序cryptcp.exe,版本3.33.0.0,時間戳0x4be18460,錯誤模塊KERNEL32.DLL,版本6.0.6002.18005,時間:

在事件日誌中找到此郵戳0x49e03821,異常代碼0xc0000142,故障偏移量0x00009eed,進程ID 0xbf4,應用程序啓動時間0x01caf1b91f5b851a。

cryptcp.exe是外部應用程序的名稱。

+0

另一方面,這個問題http://stackoverflow.com/questions/2345620/alternative-to-allow-service-to-interact-with-desktop,通過搜索相同的故障偏移量和kernel32.dll一旦你在IIS下運行,這可能表明它是一個不可逾越的問題 - cryptcp.exe必須以某種方式(通過我的閱讀)與桌面交互 – 2010-05-13 12:23:58

回答

1

查看MSDN documentation還有一些其他項目建議配置爲以另一個用戶的身份正確啓動應用程序。

  1. 設置域名,用戶名和密碼屬性(你應該設置的域)
  2. 工作目錄設置爲默認情況下使用用戶名/密碼是system32文件夾

可能幫助你解決這個問題。

+1

結果相同。 – alexey 2010-05-11 15:44:53

2

According to Microsoft,您無法讀取標準輸出和標準錯誤,因爲它會導致死鎖。要解決問題,使用類似以下內容:

private readonly StringBuilder outputText = new StringBuilder(); 
private readonly StringBuilder errorText = new StringBuilder(); 

。 。 。

 process.OutputDataReceived += delegate(
      object sendingProcess, 
      DataReceivedEventArgs outLine) 
     { 
      if (!string.IsNullOrEmpty(outLine.Data)) 
      { 
       outputText.AppendLine(outLine.Data); 
      } 
     }; 

     process.ErrorDataReceived += delegate(
      object sendingProcess, 
      DataReceivedEventArgs errorLine) 
     { 
      if (!string.IsNullOrEmpty(errorLine.Data)) 
      { 
       errorText.AppendLine(errorLine.Data); 
      } 
     }; 

     process.BeginOutputReadLine(); 
     process.BeginErrorReadLine(); 
     process.WaitForExit(); 
     Console.WriteLine(errorText.ToString()); 
     Console.WriteLine(outputText.ToString()); 
+0

謝謝,好評。但這個問題解決了另一個問題。我會評論錯誤輸出重定向。 – alexey 2010-05-13 12:00:35

1

這可能是您啓動的應用程序需要加載配置文件(默認情況下不會)。你有沒有嘗試將LoadUserProfile屬性設置爲true?

3

我意識到這是前一段時間問,但我遇到同樣的問題,發現這個網站上的解決方案:應用程序未能正確初始化固定對我來說The Perils and Pitfalls of Launching a Process Under New Credentials

應用的解決方案。

希望這會節省一些其他的時間和挫折!

+0

通過這個,你的意思是修復是什麼?該網站已關閉。 – Doug 2015-03-24 02:08:41

相關問題