2012-04-17 85 views
2

因此,我使用C#創建了Windows服務,並在Visual Studio中爲它創建了一個安裝程序。它設置爲手動運行,因爲我不希望它一直運行。然後我有另一個應用程序(C#WPF)應該有一個選項來打開和關閉服務(服務本身創建一個Web服務,反過來通信回到我的WPF應用程序)。這在Windows XP中正常工作,但在Windows 7機器上測試它不會啓動。令人驚訝的是,它確實會拋出異常並導致崩潰,但它什麼都不做。我相信這是一個權限問題。如果我使用相同的Windows 7帳戶訪問服務控制面板,則無法啓動或停止該服務。如何在Windows服務上設置權限

所以我的問題是,有沒有辦法設置我的服務,以便普通的用戶帳戶可以啓動和停止它?有沒有辦法讓我的安裝程序自動執行此操作。

我不希望我的WPF應用程序以管理員身份運行!

+2

http://serverfault.com/questions/187302/how-do-i-grant-start-stop-restart-permissions-on-a-service-to-an-arbitrary-user – 2012-04-17 20:45:17

+1

讓它運行所有的時間。但是給服務設置自己的Running標誌,你可以通過IPC控制它,命名管道,套接字,WCF。當Running爲false時,服務空閒。 – 2012-04-17 20:51:01

+0

如果它看起來不像服務,也許它不是服務:) - 也許你應該考慮替代品 – NSGaga 2012-04-17 21:08:53

回答

2

雖然我認爲可以確保服務的安全,以便普通用戶可以啓動和停止服務,但我不建議這樣做。這會造成很多併發症,並可能導致混淆。我總是希望保持簡單,尤其是在安裝和安全方面。

因此,如果我們不能讓用戶啓動和停止服務,我們可能需要讓服務始終運行。由於您不希望服務始終處於活動狀態,所以我建議您將該服務標記爲自己的內部Running。當這設置爲真時,服務處於活動狀態並且忙於做事,否則服務保持空閒狀態。您可以使用您的首選IPC機制(套接字,命名管道,WCF等)。)以允許用戶切換此開關。

1

Windows 8有一個功​​能,允許服務按需啓動,主要是響應某種觸發器。但對於Windows 7,唯一真正的選擇是將其設置爲在啓動時自動啓動。您可以將其設置爲延遲啓動,以便不會增加啓動窗口的時間。

常規用戶無法啓動和停止服務。

編輯:閱讀上面評論中的鏈接聽起來對我來說,因爲這是用戶啓動和停止服務的一攬子能力。我認爲這裏的問題是關於如何爲特定服務做到這一點。

此外,儘管可能將服務設置爲以特定用戶身份運行,但這確實意味着它只適用於該特定用戶,而工作站上的其他用戶將無法使用該應用程序, d不能啓動或停止服務,假定以用戶身份運行的服務意味着用戶可以控制它,但情況可能並非如此。

同樣在閱讀評論和其他答案時,我還想知道該服務是否可以被任何可以運行該應用程序的用戶使用。也就是說,如果用戶A登錄到工作站並啓動該應用程序(並因此啓動該服務),將其鎖定並走開,當使用B登錄並嘗試運行相同的服務時會發生什麼情況?該服務可以同時支持多個用戶,或者如果該服務由多次運行的應用程序使用,將會發生有趣的事情。

這聽起來像是希望在應用程序啓動時啓動背景。這個線程(或多個線程)將完成服務的工作,並且在應用程序結束時其本質將結束。當然,問題中的更多細節將有助於給出更好的答案。

當然,如果它作爲一個服務是合適的,我沒有理由沒有一個睡眠的工作線程的服務,另一個計時器線程充當生產者,檢查是否有工作要做。

+0

Grrr!我們現在只是即將升級到Windows 7(現在任何時候,這一直是去年的消息)。所以在我們看到Windows 8之前還需要幾年的時間! – 2012-04-18 12:55:13

+0

@MattBurland對不起,這就是現實。這回答了你的問題了嗎?如果是這樣,你會接受嗎? – Andy 2012-04-18 13:34:40

+0

該問題的第一條評論意味着此答案不正確。哪些相互矛盾的觀點是正確的? – 2012-04-18 13:41:34