我当前的项目涉及部署作为Windows服务运行的升级后的.exe文件.为了用新版本覆盖现有的.exe,我目前需要:
停止服务
卸载该服务
重新启动系统(因此Windows释放它对文件的保留)
部署新的.exe
重新安装该服务
启动升级的服务.
我想避免重启,这样就可以完全编写脚本/自动升级.
有什么办法可以避免重启吗?也许一个命令行工具会迫使Windows放弃它对旧的.exe的死亡控制?
sc delete "service name"
将删除一项服务.我发现sc实用程序比挖掘installutil更容易找到.如果您还没有,请记得停止服务.
您是否无法使用以下命令在更新之前停止服务(并在更新后重新启动)?
net stopnet start
每当我测试/部署服务时,只要服务停止,我就可以上传文件而无需重新安装.我不确定你遇到的问题是否有所不同.
我遇到了和你一样的问题.我有一个系统服务,我想卸载,然后重新安装作为更新的一部分.在某些系统上,如果没有重启,这将无法工作.问题是对DeleteService()的调用会返回ok,但是以下对CreateService()的调用会告诉我服务仍然存在,但标记为删除(错误代码1072).注册表会反映出这一点,因为子键仍然存在(在HKLM\System\CurrentControlSet\Services下),但"DeleteFlag"设置为1.从那时起,只有重新启动才能解决问题.
有些事情不起作用:
使用"sc delete":它有与I相同的问题.调用将返回ok,但服务并没有真正消失,仍然在DeleteFlag = 1的注册表中.
删除注册表中的密钥.服务管理器似乎将数据库保留在内存中,注册表只是下一次引导的副本.
添加等待循环,等待.exe文件准备好被覆盖,终止进程等.
关闭服务的句柄.哪个??
但这是有效的:
我在这篇关于stackoverflow的文章中注意到net.exe也有启动/停止功能(我只知道sc.exe实用程序).奇怪的是,"net stop svcname"加上"sc delete 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.)