如何卸载Windows服务,并删除其文件,而无需重新启动
我目前的项目涉及部署一个升级的.exe文件作为Windows服务运行。 为了用新版本覆盖现有的.exe,我目前需要:
- 停止服务
- 卸载服务
- 重新启动系统(所以Windows释放它的文件)
- 部署新的.exe
- 重新安装服务
- 启动升级的服务。
我想避免重新启动,以便这可以是一个完全脚本/自动升级。
有什么办法可以避免重新启动? 也许一个命令行工具,将迫使Windows放弃对旧的.exe的死亡控制?
sc delete "service name"
将删除一个服务。 我发现sc工具比查找installutil更容易find。 请记住如果您还没有停止服务。
更新之前无法停止服务(并在更新后重新启动)使用以下命令?
net stop <service name> net start <service name>
每当我testing/部署服务时,只要服务停止,我就可以上传文件而无需重新安装。 我不确定你遇到的问题是不同的。
我和你有类似的问题。 我有一个系统服务,我想要卸载,然后重新安装作为更新的一部分。 在某些系统上,如果没有重新启动,这将无法工作 问题是调用DeleteService()将返回正常,但以下调用CreateService()会告诉我服务仍然存在,但标记为删除(错误代码1072)。 registry反映了这一点,因为子键仍然存在(在HKLM \ System \ CurrentControlSet \ Services下),但是“DeleteFlag”被设置为1.从那时起,只有重启才能解决这个问题。
一些不起作用的东西:
- 使用“sc delete”:它有和我一样的问题。调用将会返回正常,但服务并没有真正的消失,并且仍然在DeleteFlag = 1的registry中。
- 删除registry中的密钥。 服务pipe理器似乎在内存中保存一个数据库,registry只是下次启动时的一个副本。
- 添加等待循环,等待.exe文件准备好被覆盖,终止进程等。
- closures服务的句柄。 哪个??
但是,这是什么工作:
我注意到在这里的一些文章在stackoverflow net.exe有启动/停止function(我只知道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(至less有“服务”的名称!)importNetServiceControl()。 MSDN说这个function已经过时了。 不过,我在这里find了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()诀窍。 对不起,这个post很长,但是我认为这可能会帮助有类似问题的人。 (仅供参考,我使用Win7 SP1 x64。)
如果在.net(我不知道它是否适用于所有的Windows服务)
- 停止服务(这可能是为什么你有问题。)
- InstallUtil -u [可执行文件的名称]
- Installutil -i [可执行文件的名称]
- 再次启动服务…
除非我正在改变服务的公共接口,否则我经常部署我的服务的升级版本,甚至没有unistalling /重新安装…我做的是停止服务,replace文件,并重新启动服务…
正如StingyJack和mcbala指出的那样,并且参考了Mike L提出的意见,我的经验是,在Windows 2000机器上卸载/重新安装.Net服务时,即使服务是“installutil / u”, 也需要重新启动“installutil / u”先前停止。 另一方面,“sc / delete”不需要重新启动 – 它立即删除服务(只要停止)。
我经常想知道,是否有一个很好的理由“installutil / u”需要重新启动…是“sc / delete”实际上做错了什么/留下的东西挂?
乔纳森和查尔斯都是对的…你必须先停止服务,然后卸载/重新安装。 结合他们的两个答案使完美的batch file或PowerShell脚本。
我会提到一个谨慎的经验教训 – Windows 2000 Server(可能是客户端操作系统)也需要在重新安装之前重新启动,无论如何。 必须有一个registry项,直到该框重新启动后才能完全清除。 Windows Server 2003,Windows XP和更高版本的操作系统版本不会遭受这种痛苦。
(所以Windows释放它的文件)
相反,在服务停止后立即执行Ctrl + Alt + Del并杀死服务的.exe。 比,你可以卸载服务而无需重新启动。 这发生在我以前,它解决了你需要重新启动的部分。
是否需要手动删除服务:
- 运行Regedit或regedt32。
- 在以下registry项中find您的服务的registry项:HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services
- 删除registry项
在列表更新服务之前,您将不得不重新启动
我正在使用与.NET Framework打包的InstallUtil.exe。
卸载的用法是:InstallUtil'\ path \ to \ assembly \ with \ the \ installer \ classes'/ u例如: installutil MyService.HostService.exe /u
/u
开关代表卸载,没有它,util会执行服务的正常安装。 该实用程序停止服务,如果它正在运行,我从来没有遇到问题与Windows保持locking的服务文件。 您可以在MSDN上阅读有关InstallUtil的其他选项。
PS:如果在pathvariables中没有安装path,请使用如下所示的完整path: 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 \”中find它。path中的版本号因.NET版本而异。