如何强制卸载windows服务
我使用installUtil.exe安装了一个Windows服务。
更新代码后,我再次使用installUtil.exe来安装服务,而不是先卸载原始版本。
当我现在尝试卸载服务时,installUtil.exe成功完成卸载,但服务仍然出现。
如果我尝试更改其属性,则会收到消息“服务已标记为删除”。
我如何强制删除(最好不要重新启动服务器)?
有一件事在过去一直困扰着我,如果你有服务查看器正在运行,那么可以防止服务被完全删除
您不必重新启动机器。 在提升模式下启动cmd或PowerShell。
sc.exe queryex <SERVICE_NAME>
那么你会得到一些信息。 将显示PID号码。
taskkill /pid <SERVICE_PID> /f
/ f是强制停止。
现在您可以安装或启动您的服务。
好吧,你可以使用SC.EXE强行删除任何Windows服务,如果卸载不删除任何机会。
sc delete <Service_Name>
阅读更多关于“MS Techno博客” 从服务MMC强制删除服务
我知道这不会有帮助,但它可能会帮助未来的人。
我刚刚遇到了同样的问题,closures并重新打开服务pipe理器从registry中删除了这两项,并完成了服务的卸载。
在此之前,刷新服务经理没有帮助。
sc delete sericeName
这样做之前只要确保服务已经停止。 我多次看过这个作品。 有些时候,我看到窗户卡住了东西,坚持重新启动。
closurescmd和服务窗口(如果打开),然后通过右键单击并select以pipe理员身份运行再次启动cmd。 如果sc delete sericeName
不起作用或任何不工作。
不幸的是,你需要重新启动服务器。 这应该删除“删除”的服务。
以防万一这个答案有助于某人:在这里find,你可以为pipe理员运行Sysinternals Autoruns自己节省很多麻烦。 只需转到“服务”标签并删除您的服务。
它在我没有任何权限来编辑registry的机器上为我做了一个窍门。
以下内容将在不重新启动机器的情况下运行:
- searchregistry\ HKEY_LOCAL_MACHINE的<您的服务名称>(键和值)
- 将“传统”值设置为0
在调用卸载之前是否尝试停止服务? 我随机有这个问题。 有时我可以删除它,而无需重新启动。 我的猜测是这个服务还在运行
我迟到了,但是想补充一个可能看起来很奇怪的select,但是我没有看到另一种方式:
当我每天晚上在CI过程中安装我的Windows服务时,我需要一直工作的东西,并且是完全自动化的。 出于某种原因,这些服务在卸载之后总是被标记为长时间(5分钟或更长时间)删除。 因此,我扩展了重新安装批处理脚本以确保该服务真正被删除(简化版本):
REM Stop the service first net stop My-Socket-Server REM Same as installutil.exe, just implemented in the service My.Socket.Server.exe /u :loop1 REM Easy way to wait for 5 seconds ping 192.0.2.2 -n 1 -w 5000 > nul sc delete My-Socket-Server echo %date% %time%: Trying to delete service. if errorlevel 1072 goto :loop1 REM Just for output purposes, typically I get that the service does not exist sc query My-Socket-Server REM Installing the new service, same as installutil.exe but in code My.Socket.Server.exe /i REM Start the new service net start My-Socket-Server
我能看到的是,该服务被标记为删除约5分钟(!),直到它终于通过。 最后,我不需要更多的手动干预。 我将在未来扩展脚本,以便在一段时间后发生一些事情(例如30分钟后通知)。
刷新服务列表总是为我做。 如果服务窗口是打开的,它将会保存一些存在的内存。 F5和我正在重新安装!
还要确保没有可执行文件的实例仍处于活动状态(可能是由于某种原因可能已经运行的一个独立于服务的实例)。
我正在打开和closuresMMC并寻找要杀死的PID – 但是在进程资源pipe理器中查看时,有一些现存的进程从一个被遗忘的计划批处理中运行。 杀了他们。 任务完成。
这个主题有很多论坛问题。
我已经find答案在Windows API。 卸载服务后,您不需要重新启动计算机。 你必须打电话给:
BOOL WINAPI CloseServiceHandle( SC_HANDLE hSCObject );
这closures了服务的句柄。 在Windows 7上解决了我的问题。 我做:
- 停止服务
- closures句柄
- 卸载服务
- 等待3秒
- 将新的exe文件复制到该目录
- 安装服务
- 开始服务
- closures句柄
您可以手动删除位于HKLM\SYSTEM\CurrentControlSet\Services
的registry项,之后您将看不到服务控制pipe理器中的服务(需要刷新或重新打开以查看更改),并且可以重新安装照常服务。
当TopShelf混乱或服务由于某些其他原因而失败时,我会使用以下PowerShell从几个地方拼凑起来用于我们的Octopus Deploy实例。
$ServiceName = 'MyNaughtyService' $ServiceName | Stop-Service -ErrorAction SilentlyContinue # We tried nicely, now KILL!!! $ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and $ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID Stop-Process $ServicePID -Force
这对我有效
$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'} $a.Delete()
如果你不能停止在服务中的服务 ,你可以停止你的Windows服务exe中的任务pipe理器 。 之后,您可以删除该服务。