編輯工作對於有問題的人,原來是,像往常一樣,一個簡單的問題來解決。密鑰需要安裝在服務帳戶下。登錄到服務帳戶下的工作站,安裝密鑰,然後可以從任何將在服務帳戶上下文中啓動它的會話運行。問題解決了。Windows服務的Process.Start不在網絡服務帳戶
編輯:服務操作系統是Win 2003 編輯:啓動notepad.exe時工作。讓我相信這是在調用GnuPG的控制檯應用程序中的某個地方。
我有充當一種機制,進/出網絡傳輸文件的Windows服務。對於其中一些進程,我希望在傳輸發生之前執行控制檯應用程序,或者在其發生之後執行控制檯應用程序。
我有一些問題得到控制檯應用程序到下一個網絡服務帳戶正常運行。
這是問題的佈局:
Windows服務在網絡服務帳戶運行,姑且稱之爲Company\ServiceAccount
Company\ServiceAccount
要運行Transfer A
。 Transfer A
需要在運行任何文件之前運行Console App A
。 Console App A
也發送到第三方控制檯應用程序。 (原因是 - 我們想在Console A
中嵌入更多業務邏輯,而不是將代碼放在服務本身中)
Console App A
調用免費的命令行PGP程序(GnuPG供任何人使用)。 Console App A
等待GnuPG來完成,將一些文件到落點,這樣Transfer A
可以接他們,移動它們。
應用程序代碼在本地系統帳戶下運行的工作站上運行得很好。當Windows服務運行時,我沒有從控制檯應用程序得到任何反饋。我沒有得到任何拒絕訪問錯誤或其他任何內容,這不利於嘗試調試。
問題:
- 是否有任何明顯的問題?該服務帳戶確實有效,並且在連接到網絡時沒有問題。
- 當調用第三方程序時,
Console App A
是否需要在其Process.Start()
命令中使用用戶名/域/密碼? - 很顯然,我可以選擇其他方式來做這件事,但是 - 我應該完全放棄嗎?我有一種感覺,它應該工作。
代碼:
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
你得到了什麼樣的反饋?也許事件日誌?另外,請嘗試重定向您啓動的控制檯應用程序的標準I/O。 – ErikHeemskerk 2010-08-14 04:40:55
有完整源代碼示例的最終解決方案嗎? – Kiquenet 2013-07-05 10:42:10
@Kiquenet:請看我接受的答案。 – 2013-07-08 22:20:33