2012-12-11 58 views
1

我已經構建了一個安裝Windows服務(作爲NetworkService用戶運行)的C#,.NET3.5 Web應用程序。該服務作爲網絡中任何機器的專用Web服務器,並且用戶使用其瀏覽器連接到該服務。我該如何創建一個Windows服務,在沒有用戶交互的情況下自行更新

使用Visual Studio 2008構建的msi文件安裝整個事件.msi文件安裝並運行部署應用程序,該應用程序處理設置用戶和權限以及將exe作爲服務安裝。

如果我決定增強應用程序(或找到並修復一個bug),我可以生成一個新的msi文件,並讓用戶在運行我的應用程序的所有機器上運行它。但我寧願自動發生這種情況(包括從我的網站下載更新並部署它們)。

因爲它作爲服務運行,它不是用戶特定的,所以我明白點擊一次部署不是一個選項。

有沒有什麼辦法可以實現這個目標?

回答

1

這裏是我結束了與解決方案:

在安裝服務,我給了啓動和停止服務的服務用戶權限。有關更多詳細信息,請參見my question on service permissions

服務程序檢查版本文件的遠程URL,並根據當前程序版本進行檢查。如果版本文件不同,它會下載更新壓縮文件,從中提取更新程序,鎖定文件,運行更新程序並立即退出。

更新程序鎖定相同的文件,等待幾秒鐘(只是爲了確保服務已停止),解壓zip(不包括更新程序本身),並最終重新啓動服務。

4

如果您真的不想在過程中進行任何用戶交互,您是否可以有第二個服務是更新監視程序,並確定何時可以使用新版本的主要服務,然後處理下載/停止/安裝/主要服務的開始?

+0

是的,我曾想到這一點。第二種服務可能必須以機器管理員身份運行,因此它可能會覆蓋必要的文件(並停止並重新啓動服務)。據推測,這意味着在安裝時我必須要求管理員密碼? –

+0

實際上,您已經要求管理權限,因爲您希望能夠首先重新安裝該服務。我相信無論您如何完成此任務,身份驗證都可用於此任務。 – Omaha

+0

我已經接受了這個答案,儘管我不喜歡它。據推測,我將不得不在安裝時要求用戶輸入管理員密碼,以創建管理員服務? –

0

這裏是我現在想的解決方案:

有存根的服務,沒有別的,但檢查的更新程序,運行更新程序,然後運行的主要服務項目。如果主服務程序以特定退出代碼退出,它將循環並重復(否則它正常退出)。

主服務程序檢查版本文件的遠程URL,並根據當前程序版本進行檢查。如果版本文件不同,它會下載更新壓縮文件,從中提取更新程序,並使用特殊退出碼退出。

原始安裝程序提供服務對程序文件夾運行完整權限的用戶帳戶(以便更新程序可以更新服務程序)。

唯一的缺點是不能更新存根服務。

相關問題