2011-03-01 80 views
2

目前我們在Windows啓動時在LocalService用戶下啓動了.NET WinService。該服務使用Process.Start()啓動另一個WinForms應用程序。從.NET WinService以交互式登錄用戶啓動程序

但有幾個問題在此解決方案:

  1. 我們不要等待一個交互式用戶登錄和應用程序的下降,因爲它試圖和初始化失敗的DirectX設備。
  2. 在LocalService下啓動的應用程序與Windows XP中的用戶桌面完美交互。但它在Windows 7中不起作用,因爲win7中每個用戶都有不同的圖形工作站。
  3. 有時我們需要運行具有當前交互式登錄用戶權限的應用程序。

是否有人知道如何等待用戶在服務中的交互式登錄並啓動具有這些用戶權限的WinForms應用程序?

我認爲這有助於解決所有問題。

+0

如果您希望在用戶登錄時啓動具有用戶權限的應用程序,則其中一個標準自動運行選項(註冊表項或啓動文件夾)有什麼問題? – Zooba 2011-03-01 20:31:38

+0

@Zooba,winservice的任務之一是在啓動後關注應用程序,並在啓動時重啓應用程序。 – acoolaum 2011-03-01 20:34:40

+0

@acoolaum Windows本身提供了一些此功能(http://msdn.microsoft.com/en-us/library/cc303708.aspx),這可能是一個選項,或者應用程序可以在啓動時通知服務達到相同的效果? – Zooba 2011-03-01 20:44:41

回答

2

您將需要一個單獨的客戶端應用程序。看看這個文檔,第6頁:http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx

對於您的監視/重啓場景,請查看文檔中提到的CreateProcessAsUser。您幾乎肯定需要讓您的客戶端應用程序與此服務協調,並且它仍然會將一個方形釘子推入圓孔。

+0

好吧,我會讀它,但我認爲它可能只解決問題二。 – acoolaum 2011-03-01 20:30:35

+0

最有可能的是,因爲其他兩個問題並不是真正意義上的服務。 – 2011-03-01 20:45:16

+0

爲什麼不呢?我的WinService的主要目標是關鍵的應用程序運行狀況監控,併爲計算機提供遠程控制。 – acoolaum 2011-03-02 05:23:05

1

我會嘗試使用上述答案的組合。

解決#1 在用戶登錄時,使用註冊表或啓動文件夾中的自動啓動啓動Winforms應用程序。讓它通知它已成功啓動的服務。

確保Winform應用程序在用戶登錄後成功啓動: 讓您的服務檢查應用程序是否已開始在後臺運行,但不要讓它執行初始啓動。 相反,只要讓用戶登錄時註冊,就應該可以通過監聽OnSessionChange來完成。 設置X秒的延遲時間,以允許登錄/啓動過程完成,然後開始檢查正在運行的應用程序(好吧,也許不是最佳解決方案)。

如果服務發現應用程序未啓動或崩潰,請使用方法Mark指出的CreateProcessAsUser從服務中重新啓動它。

1

這可能只是不正確的做法,你正在做什麼?看起來有可能您最好將監控邏輯或任何具有正常運行時間要求的服務放入服務中,以便它可以「始終開啓」。然後,您將在WinForms應用程序中留下UI邏輯,該應用程序可以打開或關閉,不會產生任何不良影響。