我使用installUtil.exe安装了一个Windows服务。
更新代码后,我再次使用installUtil.exe安装服务,无需首先卸载原始版本。
当我现在尝试卸载该服务时,installUtil.exe会成功完成卸载,但仍会显示该服务。
如果我尝试更改其属性,则会收到消息“服务已标记为删除”。
如何强制删除(最好不要重启服务器)?
答案 0 :(得分:435)
过去让我感到震惊的一件事是,如果您运行服务查看器,那么就会阻止服务被完全删除,所以事先将其关闭
答案 1 :(得分:133)
您无需重新启动计算机。以提升模式启动cmd或PowerShell。
sc.exe queryex <SERVICE_NAME>
然后你会得到一些信息。将显示一个PID编号。
taskkill /pid <SERVICE_PID> /f
其中/ f是强制停止。
现在您可以安装或启动服务。
答案 2 :(得分:90)
好吧,如果卸载没有任何机会删除,你可以使用SC.EXE强制删除任何Windows服务。
sc delete <Service_Name>
详细了解“MS Techno Blogging”Deleting Services Forcefully from Services MMC
答案 3 :(得分:36)
我知道这不会有所帮助,但未来可能对某人有帮助。
我刚遇到同样的问题,关闭并重新打开服务管理器,从注册表中删除了这两个条目并完成了服务的卸载。
在此之前,刷新服务经理并没有帮助。
答案 4 :(得分:9)
sc delete sericeName
在执行此操作之前,请确保服务已停止。我大部分时间都看过这项工作。有些时候我看到Windows卡在某些东西上并坚持重启。
答案 5 :(得分:4)
不幸的是,您需要重新启动服务器。 这应该删除“已删除”服务。
答案 6 :(得分:4)
如果已打开,请关闭cmd和服务窗口,然后右键单击并选择以管理员身份运行再次启动cmd。如果sc delete sericeName
不起作用或任何不起作用。
答案 7 :(得分:3)
如果这个答案可以帮助某人:找到here,那么以管理员身份运行Sysinternals Autoruns可能会给您带来很多麻烦。 只需转到&#34;服务&#34;选项卡并删除您的服务。
在我没有任何编辑注册表权限的机器上,它为我做了诀窍。
答案 8 :(得分:2)
以下操作无需重新启动机器即可运行:
答案 9 :(得分:1)
您是否尝试在调用卸载之前停止服务?我随机有这个问题。有时我可以删除它而不重新启动。我的猜测是它与仍在运行的服务有关
答案 10 :(得分:1)
这对我有用
$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
答案 11 :(得分:1)
我迟到了,但想添加一个可能看起来很奇怪的替代品,但我没有看到另一种方式:
当我每晚在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分钟后的通知)。
答案 12 :(得分:0)
该主题有很多论坛问题。
我在windows api中找到了答案。卸载服务后,无需重新启动计算机。你必须打电话:
BOOL WINAPI CloseServiceHandle(
SC_HANDLE hSCObject
);
关闭服务的句柄。在Windows 7上它解决了我的问题。 我这样做:
答案 13 :(得分:0)
还要确保没有可执行文件的实例仍然处于活动状态(可能是由于某种原因,可能已经运行的实例,与服务无关)。
我正在打开和关闭MMC并寻找要杀死的PID - 但是当查看进程资源管理器时,有一些现存的进程是从一个被遗忘的计划批处理中运行的。杀了他们。任务完成。
答案 14 :(得分:0)
您可以手动删除位于HKLM\SYSTEM\CurrentControlSet\Services
的服务的注册表项,之后您将无法在服务控制管理器中看到该服务(需要刷新或重新打开以查看更改),您可以像往常一样重新安装服务。
答案 15 :(得分:0)
当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
答案 16 :(得分:0)
刷新服务列表总是为我做的。如果服务窗口是打开的,它将保留一些由于某种原因存在的内存。 F5和我再次重新安装!
答案 17 :(得分:0)
如果您无法在服务中停止服务,则可以在任务管理器中停止Windows服务exe。之后,您可以删除该服务。
答案 18 :(得分:0)
这还值得注意:
sc delete "ServiceName"
在PowerShell中不起作用,sc是PowerShell中cmdlet Set-Content的别名。您需要这样做:
sc.exe delete "ServiceName"