轉載自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html
可能是太過於懶惰的原因,研究個windows 服務的安裝程式都花了大半天時間。在網上看了一些樣本,大部分都言過其實,把過程搞得太過複雜,老是需要去研究如何利用InstallUtil.exe及其參數。事實上,既然要安裝.net下製作的windows服務,肯定首先得在目標機器上安裝有.net架構。因此,InstallUtil.exe也一定已經存在目標機器上了,因而利用微軟的傻瓜式操作就能很好地解決windows服務安裝和卸載的問題。
過一段時間估計還要狠狠地利用windows服務來完成一些功能,為了加深印象,又回過頭弄了一個名叫HelloWorldService的windows服務,用最簡單的demo來完成所有的操作。這個服務的功能,僅僅是在它啟動的時候建立一個HelloWorld.txt檔案,裡邊寫上Hello World!這幾個簡單的字母而已。
1、選擇Visual C#->Windows->Windows 服務,建立一個HelloWorldService項目。
2、通過ServiceName更改服務的名稱為”HelloWorldService“,這是最後在安裝服務成功後在服務管理面板出現的名稱。
3、將Service1.cs更名為HelloWorldService.cs,在其OnStart方法中寫入簡單的代碼,用來實現建立檔案並寫入“Hello World!"這幾個經典字母。
4、在HelloWorldService.cs的設計介面點右鍵,在快顯功能表中選擇”添加安裝程式“。
點擊後出來的設計介面上添加了兩個控制項——ServiceProcessInstall和ServiceInstaller。
ServiceProcessInstall安裝一個可執行檔,該檔案包含擴充 ServiceBase 的類。該類由安裝工具 + 生產力(如 InstallUtil.exe)在安裝服務應用程式時調用。在這裡主要是修改其Account屬性。ServiceAccount指定服務的安全上下文,安全上下文定義其登入類型。
LocalService 充當本機電腦上非特權使用者的帳戶,該帳戶將匿名憑據提供給所有遠程伺服器。
LocalSystem 服務控制管理員使用的帳戶,它具有本機電腦上的許多許可權並作為網路上的電腦。
NetworkService 提供廣泛的本地特權的帳戶,該帳戶將電腦的憑據提供給所有遠程伺服器。
User 由網路上特定的使用者定義的帳戶。如果為 ServiceProcessInstaller.Account 成員指定 User,則會使系統在安裝服務時提示輸入有效使用者名稱和密碼,除非您為 ServiceProcessInstaller 執行個體的 Username 和 Password 這兩個屬性設定值。
ServiceInstaller安裝一個類,該類擴充 ServiceBase 來實現服務。在安裝服務應用程式時由安裝工具 + 生產力調用該類。在這裡主要修改其StartType屬性。此值指定了服務的啟動模式。
Automatic 指示服務在系統啟動時將由(或已由)作業系統啟動。如果某個自動啟動的服務依賴於某個手動啟動的服務,則手動啟動的服務也會在系統啟動時自動啟動。
Disabled 指示禁用該服務,以便它無法由使用者或應用程式啟動。
Manual 指示服務只由使用者(使用“服務控制管理員”)或應用程式手動啟動。
5、上面這些都是安裝包最終要安裝/卸載的對象。下面就來看看如何用.net製作安裝包。
需要在解決方案裡邊添加一個安裝項目,取其名稱為HelloWorldSetup。
6、添加工程後,在預設的視圖介面右鍵點擊”應用程式檔案夾“,選擇”添加“->”項目輸出“。 在彈出的視窗中選擇“主輸出”,點擊“確定”。 7、上面的步驟定義了最後在應用程式檔案夾中包含的內容。下面來定義其他方面的內容。在項目上點右鍵,選擇 視圖->自訂動作。 8、出來如下的介面,然後在”自訂動作“上點右鍵,選擇”添加自訂動作“。
在彈出的視窗中雙擊”應用程式檔案夾“。
然後選擇”主輸出來自HelloWorldService(活動)“,點擊”確定“。
選擇之後會發現所有的操作下邊都添加了剛才選定的項。做到這一步,就能使安裝程式卸載時不僅把程式卸載下來,也能把服務卸載下來。
9、接下來在安裝項目上點右鍵,選擇”產生“,就能使安裝程式正常發布了,成功後會產生兩個檔案。
把這兩個檔案拷到目標機器上,雙擊HelloWorldSetup.msi檔案,就可以開始安裝服務的征途了。
安裝成功後,就可以從服務管理面板中欣喜地看到我們夢寐以求的服務程式了。
不過在我點啟動的時候,還出現了一段小插曲——系統報錯了。錯誤如:
不過不用急,這種錯誤可以在系統的”事件檢視器“中的”應用程式“選項中查看具體的錯誤資訊。
呵呵,原來是由於服務對於檔案系統的操作許可權問題所引起的。跑回去一看,發現在第5步中對ServiceProcessInstaller的Account設定成了LocalService,於是乎改成了LocalSystem。然後重新發布安裝程式,再重新安裝服務,再啟動,呵呵,一切正常!
10、最後,一起來欣賞這個windows 服務的成果:
總結:遇到問題的時候一定要冷靜,由淺入深系統地瞭解當前事務,而不要急於求成,這樣的效率反而會比較低下。