如何强制卸载Windows服务

时间:2008-10-22 11:09:26

标签: .net windows-services

我使用installUtil.exe安装了一个Windows服务。

更新代码后,我再次使用installUtil.exe安装服务,无需首先卸载原始版本。

当我现在尝试卸载该服务时,installUtil.exe会成功完成卸载,但仍会显示该服务。

如果我尝试更改其属性,则会收到消息“服务已标记为删除”。

如何强制删除(最好不要重启服务器)?

19 个答案:

答案 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不起作用或任何不起作用。

http://weblogs.asp.net/avnerk/archive/2007/09/05/windows-services-services-msc-and-the-quot-this-service-is-marked-for-deletion-quot-error.aspx

答案 7 :(得分:3)

如果这个答案可以帮助某人:找到here,那么以管理员身份运行Sysinternals Autoruns可能会给您带来很多麻烦。 只需转到&#34;服务&#34;选项卡并删除您的服务。

在我没有任何编辑注册表权限的机器上,它为我做了诀窍。

答案 8 :(得分:2)

以下操作无需重新启动机器即可运行:

  1. 在Registry \ HKEY_LOCAL_MACHINE中搜索&lt;您的服务名称&gt; (键和值都是)
  2. 将“Legacy”值设置为0

答案 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上它解决了我的问题。 我这样做:

  • 停止服务
  • 关闭句柄
  • 卸载服务
  • 等待3秒
  • 将新exe复制到目录
  • 安装服务
  • 开始服务
  • 关闭句柄

答案 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"