2010-08-14 71 views
1

編輯工作對於有問題的人,原來是,像往常一樣,一個簡單的問題來解決。密鑰需要安裝在服務帳戶下。登錄到服務帳戶下的工作站,安裝密鑰,然後可以從任何將在服務帳戶上下文中啓動它的會話運行。問題解決了。Windows服務的Process.Start不在網絡服務帳戶

編輯:服務操作系統是Win 2003 編輯:啓動notepad.exe時工作。讓我相信這是在調用GnuPG的控制檯應用程序中的某個地方。

我有充當一種機制,進/出網絡傳輸文件的Windows服務。對於其中一些進程,我希望在傳輸發生之前執行控制檯應用程序,或者在其發生之後執行控制檯應用程序。

我有一些問題得到控制檯應用程序到下一個網絡服務帳戶正常運行。

這是問題的佈局:

Windows服務在網絡服務帳戶運行,姑且稱之爲Company\ServiceAccount Company\ServiceAccount要運行Transfer ATransfer A需要在運行任何文件之前運行Console App AConsole App A也發送到第三方控制檯應用程序。 (原因是 - 我們想在Console A中嵌入更多業務邏輯,而不是將代碼放在服務本身中)

Console App A調用免費的命令行PGP程序(GnuPG供任何人使用)。 Console App A等待GnuPG來完成,將一些文件到落點,這樣Transfer A可以接他們,移動它們。

應用程序代碼在本地系統帳戶下運行的工作站上運行得很好。當Windows服務運行時,我沒有從控制檯應用程序得到任何反饋。我沒有得到任何拒絕訪問錯誤或其他任何內容,這不利於嘗試調試。

問題:

  1. 是否有任何明顯的問題?該服務帳戶確實有效,並且在連接到網絡時沒有問題。
  2. 當調用第三方程序時,Console App A是否需要在其Process.Start()命令中使用用戶名/域/密碼?
  3. 很顯然,我可以選擇其他方式來做這件事,但是 - 我應該完全放棄嗎?我有一種感覺,它應該工作。

代碼:

 System.Diagnostics.Process process = null; 
     System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(executable, args); 

     string pwd = "mypassword"; //edited for security 
     System.Security.SecureString securePwd = new System.Security.SecureString(); 

     foreach (char c in pwd) 
      securePwd.AppendChar(c); 

     try 
     { 
      psi.UseShellExecute = false; 
      psi.WindowStyle = ProcessWindowStyle.Hidden; 
      psi.CreateNoWindow = true; 
      psi.ErrorDialog = false; 
      psi.Password = securePwd; 
      psi.UserName = "myserviceaccount"; //edited for security 
      psi.Domain = "MyCompanyDomain"; //edited for security 
      process = System.Diagnostics.Process.Start(psi); 
      //Wait for the process to finish 
      process.WaitForExit(); 
      process.Close(); 
     } 
     catch (System.InvalidOperationException iox) { } //handle 
     catch (System.ArgumentException ax) { } //handle 
     catch (System.ComponentModel.Win32Exception wx) { } //handle 
     catch (System.IO.FileNotFoundException fnfx) { } //handle 
+0

你得到了什麼樣的反饋?也許事件日誌?另外,請嘗試重定向您啓動的控制檯應用程序的標準I/O。 – ErikHeemskerk 2010-08-14 04:40:55

+0

有完整源代碼示例的最終解決方案嗎? – Kiquenet 2013-07-05 10:42:10

+0

@Kiquenet:請看我接受的答案。 – 2013-07-08 22:20:33

回答

3

對於任何有問題的人來說,結果如往常一樣,只是一個簡單的問題需要解決。密鑰需要安裝在服務帳戶下。登錄到服務帳戶下的工作站,安裝密鑰,然後可以從任何將在服務帳戶上下文中啓動它的會話運行。問題解決了。

0

與Windows Vista服務入手,明確禁止與用戶交互會話,即使標記爲互動。見Interactive Services

重要服務不能直接 與用戶交互與Windows Vista的 的。因此,標題爲使用 交互式服務的部分中提到的技術 不應該在新代碼中使用 。

如果您的「控制檯應用程序*在做任何類型的用戶交互,它就會失敗。可以這樣嗎?如果是的話,那麼你不能讓你的'控制檯應用程序'從服務運行,他們將不得不從用戶會話啓動。

+0

控制檯應用程序不需要用戶輸入。我們只需傳入命令行參數。 – 2010-08-14 15:31:13

相關問題