如何卸载Windows服务,并删除其文件,而无需重新启动

我目前的项目涉及部署一个升级的.exe文件作为Windows服务运行。 为了用新版本覆盖现有的.exe,我目前需要:

  1. 停止服务
  2. 卸载服务
  3. 重新启动系统(所以Windows释放它的文件)
  4. 部署新的.exe
  5. 重新安装服务
  6. 启动升级的服务。

我想避免重新启动,以便这可以是一个完全脚本/自动升级。

有什么办法可以避免重新启动? 也许一个命令行工具,将迫使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。 比,你可以卸载服务而无需重新启动。 这发生在我以前,它解决了你需要重新启动的部分。

是否需要手动删除服务:

  1. 运行Regedit或regedt32。
  2. 在以下registry项中find您的服务的registry项:HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services
  3. 删除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版本而异。