2011-08-26 97 views
8

我想從WCF服務端的內部網客戶端運行一個進程。在我的情況下,客戶請求服務器在提供的證書下在服務器的機器上創建一個新進程。 WCF服務託管在IIS 7.5和我使用此代碼如何從IIS託管的WCF服務啓動進程?

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe") 
{ 
    UserName = "some user", 
    Password = MakeSecureString("some password"), 
    UseShellExecute = false, 
    LoadUserProfile = true 
}; 

Process process = Process.Start(processInfo); 
啓動一個進程

如果我是主持人WCF服務爲自託管控制檯應用程序下,管理員用戶運行,我看到記事本在另一個用戶啓動此代碼工作。它無法在IIS上有沒有異常,但處理立即終止

process.HasExited = true; 
process.ExitCode = -1073741502; 

在IIS WCF應用具有管理員權限的用戶下運行,並已獲得在web.config中定義的完全信任。我無法使用自託管的應用程序,因爲它不支持簡單的持續交付(如WebDeploy與IIS網站)。

問:如何從IIS上託管的WCF服務啓動服務器端的進程?

編輯:
我偶然發現了這個post,類似的問題,我想那裏所有的方法,包括的Process.Start與CreateProcessWithLogonW的P/Invoke和CreateProcessAsUser所有可能的變化我也試過授予額外的權限給用戶。非此,將與錯誤消息相同的人張貼。

+0

任何具有完整源代碼示例的最終解決方案? – Kiquenet

+0

沒有骯髒的黑客是不可能的。我沒有這樣做。 – oleksii

+0

哪個髒駭客? – Kiquenet

回答

4

奧萊克西的一點是,如果你的主機在一個控制檯應用程序的WCF服務,有一個Windows會話(用戶登錄和Windows資源管理器中加載)爲用戶和記事本打開並顯示該用戶,所以你可以在用戶界面中看到它。

當您在IIS中託管您的WCF服務時,作爲服務器,IIS需要並且不允許用戶交互,並且在沒有用戶登錄時也可以工作;在這種情況下,沒有用戶界面來託管您的記事本或其他啓用了UI的應用程序,您可以執行一個進程以進行細化或其他批處理作業,但不會呈現Windows UI應用程序,因爲Windows資源管理器未加載給您,並且沒有地方呈現您的流程的用戶界面。

+1

我希望WCF服務託管在IIS中(用戶A在AppPool中),並在我使用Process.Start調用我的命令EXE(命令行,而不是UI)時與另一個用戶B模擬。有什麼建議麼?也許不可能。 – Kiquenet

1

這裏是我用來調用GnuPGP做加密。你的設置如何比較?

private int ExecuteCommand(string arguments, string passPhrase, int timeout) 
     { 
      Process processObject; 
      ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments); 


      pInfo.CreateNoWindow = true; 
      pInfo.UseShellExecute = false; 

      pInfo.RedirectStandardInput = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      processObject = Process.Start(pInfo); 

      if (!string.IsNullOrEmpty(passPhrase)) 
      { 
       processObject.StandardInput.WriteLine(passPhrase); 
       processObject.StandardInput.Flush(); 
      } 

      string result = processObject.StandardOutput.ReadToEnd(); 
      string error = processObject.StandardError.ReadToEnd(); 

      if (!processObject.WaitForExit(timeout)) 
      { 
       throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds "); 
      } 

      int exitcode = processObject.ExitCode; 

      Error = error; 
      Output = result; 

      return exitcode; 

     } 
+0

沒有這不會幫助這行後'processObject = Process.Start(pInfo);'它hasExited設置爲true。 – oleksii

+0

你不是真的想跑記事本,對嗎? –

+0

實際上,我是一個測試其他軟件功能以檢測進程啓動的測試工具。 – oleksii

1

有一個應用程序池設置,以確保它加載用戶配置文件。

loadUserProfile Optional Boolean attribute. 

Specifies whether IIS loads the user profile for the application pool identity. Setting  
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity. 

The default value is false. 

與域用戶一起作爲具有足夠權限的身份可能會工作?我知道用戶至少需要一個用戶配置文件。

這就是說,它有點奇怪的架構。看起來像一個更好的拱門將是有一個持久的過程像網站與之通信的Windows服務,但我不確定你的約束是什麼。

希望有所幫助。

+0

感謝您的回答。這是有道理的。使用IIS,通過WebDeploy交付產品會更容易,因爲我可以創建Web場。也就是說,我嘗試了Win Service,並且在那裏也遇到了相同的問題。我正在逆轉命令行託管和腳本部署,因爲在IIS上配置它很痛苦。 – oleksii