我當前的項目涉及部署一個作爲Windows服務運行的升級後的.exe文件。爲了與新版本覆蓋現有的.exe文件,我目前需要:如何在不重新啓動的情況下卸載Windows服務並刪除其文件
- 停止服務
- 卸載服務
- 重新引導系統(這樣的Windows版本它按住文件)
- 部署新的.exe
- 重新安裝服務
- 開始升級服務。
我想避免重新啓動,以便這可以完全腳本化/自動升級。
有什麼辦法可以避免重新啓動?也許一個命令行工具會迫使Windows放棄它對舊的.exe的死亡控制?
我當前的項目涉及部署一個作爲Windows服務運行的升級後的.exe文件。爲了與新版本覆蓋現有的.exe文件,我目前需要:如何在不重新啓動的情況下卸載Windows服務並刪除其文件
我想避免重新啓動,以便這可以完全腳本化/自動升級。
有什麼辦法可以避免重新啓動?也許一個命令行工具會迫使Windows放棄它對舊的.exe的死亡控制?
sc delete "service name"
將刪除一項服務。我發現sc utility比查找installutil更容易找到。請記住,如果您尚未停止該服務。
使用以下命令在更新(並在更新後重新啓動)之前是否無法停止該服務?
net stop <service name>
net start <service name>
每當我測試/部署服務時,只要服務停止,我就可以上傳文件而無需重新安裝。我不確定你遇到的問題是不同的。
這一直是我的經驗 - 我無休止地更新服務,只是停止它們並替換.EXE。無論如何,這只是一個普通的過程。 – 2008-12-05 22:08:51
同樣在這裏 - 爲我所描述的一系列Windows服務(在Windows 7上運行)的幾個月的開發工作。 – J0e3gan 2013-05-01 05:26:34
如果.NET(我不知道這是否適用於所有Windows服務)
除非我改變服務的公衆詮釋erface,我經常部署我的服務升級版本,甚至沒有unistalling /重新安裝... ALL我會停止服務,更換文件,並重新啓動服務...
在我的情況下,我不能這樣做,由於一些許可問題 – 2013-04-02 15:22:59
喬納森和查爾斯都是正確的......你必須先停止服務,然後卸載/重新安裝。結合他們的兩個答案可以創建完美的批處理文件或PowerShell腳本。
我會提到一個謹慎學習的難題 - Windows 2000 Server(可能是客戶端操作系統)以及重新安裝前需要重新啓動,無論如何。必須有一個註冊表項在重新啓動後才能完全清除。 Windows Server 2003,Windows XP和更高版本的操作系統版本不會遭受這種痛苦。
(所以Windows版本它按住 文件)
相反,做按Ctrl + Alt + Del鍵右側的服務停止後,殺死服務的.exe文件。除此之外,您可以在不重新啓動的情況下卸載該服務。這在過去發生在我身上,它解決了您需要重新啓動的部分。
正如注意到StingyJack和mcbala,並參照由Mike證關於意見,我的經驗是,在Windows 2000機器上,卸載/重新安裝.NET服務時,「installutil/U」 確實需要重新啓動,即使服務先前已停止。另一方面,「sc/delete」不需要重新啓動 - 它會立即刪除服務(只要它停止)。
實際上,我經常想知道是否有一個很好的理由「installutil/u」需要重新啓動......「sc/delete」是否實際上做了錯誤的事情/在掛什麼東西?
如果它需要手動刪除服務:
你將不得不重新啓動列表中獲取服務
更新前我和你有同樣的問題。我有一個系統服務,我想要卸載,然後重新安裝作爲更新的一部分。在某些系統上,如果沒有重新啓動,這將無法工作問題是,調用DeleteService()將返回正常,但以下調用CreateService()會告訴我服務仍然存在,但標記爲刪除(錯誤代碼1072)。由於子鍵仍然存在(在HKLM \ System \ CurrentControlSet \ Services下),但「DeleteFlag」被設置爲1,因此註冊表反映了這一點。從那時起,只有重新啓動才能解決這種情況。
有些事情不工作:
但這裏是什麼工作:
我在一些文章注意到這裏對NET.EXE有啓動/停止功能,以及(我只知道SC.EXE效用)計算器。奇怪的是,一個「淨停止svcname」加上「sc刪除svcname」工作!所以net.exe必須做一些我不會做的事情。
但net.exe不包含對ControlService()的導入,那麼它如何停止服務?我發現net.exe產生net1.exe,但是net1.exe也不會導入ControlService()。我使用了很棒的API監控工具(http://www.rohitab.com/apimonitor)來查看net1。exe正在做,但它從來沒有稱任何看起來很有希望的東西。
但後來我看到它從NETAPI32.DLL(它的名稱中至少有「Service」)導入NetServiceControl()。 MSDN說這個功能已經過時了。儘管如此,我在LMSvc.h中找到了原型,並在這裏找到了一些參數說明:http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html。當您加載NETAPI32.DLL並使用NetServiceControl(NULL, service_name, 3, 0, 0)
(3用於SERVICE_CTRL_UNINSTALL,用於停止)後,服務將停止。之後可以刪除並重新安裝,而無需DeleteFlag或重新啓動!
因此,它從來不是一個刪除問題,而是正確地停止服務。和NetServiceControl()有訣竅。很抱歉,這篇長文章,但我認爲它可以幫助有類似問題的人。 (僅供參考,我使用Win7 SP1 x64。)
我正在使用與.NET Framework一起打包的InstallUtil.exe。
用法卸載是:InstallUtil「\路徑\到\組件\與\的\安裝\類」/U所以例如:installutil MyService.HostService.exe /u
的/u
開關手段卸載,如果沒有它的util的執行正常安裝服務。如果該服務正在運行,該實用程序將停止該服務,並且我從來沒有遇到Windows保持服務文件鎖定的問題。您可以在MSDN上閱讀有關InstallUtil的其他選項。如果你的路徑變量中沒有installutil,請使用如下所示的完整路徑:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "C:\MyServiceFolder\MyService.HostService.exe" /u
,或者如果你需要64位版本,可以在'C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \'。路徑中的版本號因.NET版本而異。
感謝大家的幫助!我發現我的問題的來源是WMI的.exe句柄。請參閱我的新問題:http://stackoverflow.com/questions/302315/want-to-script-window-wmi-wmiprvseexe-to-release-handle-on-file – 2008-11-19 15:44:10
僅供參考,如果您打開服務經理,您需要在重新安裝服務之前關閉,否則您將收到'服務已被標記爲刪除'錯誤。 – ChandlerPelhams 2012-07-03 21:20:15
在[我的經驗](http://stackoverflow.com/a/16293612/1810429)「[SC] CreateService失敗1072:指定的服務已被標記爲刪除」取決於所卸載的服務是否尚未先停止。我試圖重現錯誤,只是打開了Services管理工具並且無法執行。 – J0e3gan 2013-05-01 05:16:14