我的当前项目涉及部署作为Windows运行的升级.exe文件。为了用新版本覆盖现有的.exe,我目前需要:
我想避免重新启动,这样就可以完全编写脚本/自动升级。
有什么办法可以避免重启吗?也许是一个命令行工具,可以迫使Windows放弃对旧.exe的死亡控制?
发布于 2008-11-19 13:47:39
sc delete "service name"
将删除一个服务。我发现sc效用的定位比在安装程序中挖掘要容易得多。如果你还没有,记得停止服务。
发布于 2012-07-09 16:15:26
我和你有同样的问题。我有一个系统服务,我想卸载,然后作为更新的一部分重新安装。在某些系统上,如果没有重新启动,这是行不通的。问题是对DeleteService()的调用将返回ok,但是下面对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导入了NetServiceControl() (它的名字中至少有“服务”!)。MSDN说这个功能已经过时了。不过,我在LMSvc.h中找到了原型,并在这里找到了一些参数描述:NetServiceControlorN.html。当您加载NETAPI32.DLL并使用NetServiceControl(NULL, service_name, 3, 0, 0)
(3用于SERVICE_CTRL_UNINSTALL,用于停止)时,服务将在结束后停止。而且它可以在没有DeleteFlag或重新启动的情况下被删除和重新安装!
因此,这不是删除的问题,而是正确停止服务的问题。而NetServiceControl()就能做到这一点。很抱歉发了这么长的邮件,但我想这可能会对有类似问题的人有所帮助。(仅供参考,我使用Win7 SP1 x64。)
发布于 2008-11-18 18:10:36
您不能使用以下命令在更新之前停止服务(并在更新后重新启动)?
net stop <service name>
net start <service name>
每当我测试/部署服务时,只要服务停止,我就可以上传文件而无需重新安装。我不确定你遇到的问题是不是不一样。
https://stackoverflow.com/questions/299604
复制相似问题