2011-12-01 51 views
2

我有以下代碼正在工作。我的回調方法在生成時會隨程序的輸出調用。System.Diagnostics.Process扮演其他用戶

var proc = new System.Diagnostics.Process(); 
//proc.StartInfo.Domain = DOMAIN; 
//proc.StartInfo.UserName = USERNAME; 
//proc.StartInfo.Password = BuildPasswordString(); 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.FileName = EXEC_PATH; 
proc.StartInfo.Arguments = EXEC_ARGS; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.Start(); 
proc.OutputDataReceived += proc_OutputDataReceived; 
proc.BeginOutputReadLine(); 
proc.WaitForExit(); 

但是,只要我取消關於用戶憑據的三條線,一切都停止工作。代碼執行時沒有錯誤,但該進程不運行,並且在我的回調方法中沒有接收到輸出。

如何執行單獨的進程,在生成時異步收集其輸出,同時使用與執行進程不匹配的特定用戶憑據?

更新:
大廈關閉@ Dos095,拉斯的答案,我測試了相同的代碼與控制檯應用程序而不是ASP.NET。它確實有效。所以這是導致失敗的ASP.NET環境中的一些東西。

+0

重複:http://stackoverflow.com/questions/4624113/how-to-process-start-with-impersonated-domain-user –

+0

對我來說,這看起來不像是重複的。該問題有不同的代碼和不同的症狀... – RationalGeek

回答

0

我認爲問題在於UAC的安全機制:您的初始應用程序無權讀取另一個用戶進程的輸出(即使它是一個子進程)。嘗試使用管理員權限啓動您的應用程序,並查看您是否編碼工作。

我認爲解決您的問題的最好方法是將您的子進程輸出重定向到一個文件,並在您的初始apllication中創建一個線程來檢查該文件的更新。

也發現了類似的問題Get error and standard output from an elevated child process

+0

我從ASP.NET執行。在管理員帳戶下運行它是不可取的。但是我會將代碼移到控制檯應用程序,以查看症狀是否消失。有趣的想法將輸出重定向到文件然後讀取文件,但是子進程似乎甚至不能執行*。我現在將它輸出到一個文件,並且該文件在用用戶憑證運行時不會更新。 – RationalGeek

+0

哦,你沒有提到ASP.NET。就我所知,Web應用程序是在安裝時定義的特殊帳戶下運行的。這意味着你的exe文件放在asp文件夾的某個地方。是否有可能您指定的用戶無權訪問該文件夾? –

+0

我在控制檯應用程序中運行它,它的工作使ASP.NET絕對是罪魁禍首。我將嘗試以系統帳戶身份運行ASP.NET進程,以查看它是否如此工作。 – RationalGeek

2

我花了差不多2天解決這個問題... 這裏是解決方案:http://forums.asp.net/p/1032763/3054483.aspx

簡單地說,你需要設置「應用程序池的標識」與您的「proc.StartInfo.UserName」「proc.StartInfo.Password」相同。

您可以更改確定的「默認應用」使用「proc.StartInfo.UserName」作爲確定創建一個新的「應用程序池」

當然,如果你創建一個新的「應用程序池」,你必須分配你的asp.net web應用程序使用這個「應用程序池」。

希望它是有用的,祝你好運。 lzch