如何强制卸载Windows服务


173

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

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

现在,当我尝试卸载该服务时,installUtil.exe成功完成了卸载,但是该服务仍然出现。

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

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


如果服务挂起并且删除不起作用,请参阅如何强制卸载Windows服务
Wernfried Domscheit

Answers:


469

过去让我着迷的一件事是,如果您正在运行服务查看器,那么这会阻止服务被完全删除,因此请事先关闭


70
我简直不敢相信打开查看器会破坏服务的删除-多么愚蠢!
Draemon

1
这对Microsoft来说太愚蠢了,但确实有效。由于某些无法解释的原因,打开服务查看器有时会导致它们无法正确删除。
ivantod

1
我认为这个答案会有数百条类似的评论。我刚刚因为这个愚蠢的问题而失去了30分钟的时间
PierrOz 2015年

2
似乎SysInternals进程浏览器也锁定了服务(也许还有任务管理器),因此请确保您也关闭了这些服务!
danio

3
还请确保使用cmd提示符。PowerShell不会显示任何错误,但不会删除任何一个。
布鲁诺·法里亚

144

您不必重新启动计算机。在提升模式下启动cmd或PowerShell。

sc.exe queryex <SERVICE_NAME>

然后,您将获得一些信息。将显示一个PID编号。

taskkill /pid <SERVICE_PID> /f

/ f强制停止。

现在,您可以安装或启动服务。


2
出色地工作,除了重新启动以外,其他所有操作均失败-非常高兴!
DaveF

36
这对我不起作用-我的服务的pid返回0,并且不允许我删除关键的系统进程。
血浆147

4
A +很棒。然后使用sc delete删除。
2013年

7
PID设为0时没有工作,这解决了我的问题- (SC)DeleteService失败1072
Web-E

3
绝对有帮助!就我而言,重新启动什么都没有。甚至没有删除注册表中的服务目录!不过有一个陷阱:如果您使用的是PowerShell,请使用:sc.exe queryex <SERVICENAME>。因为sc它也是的别名Set-Content,所以当您使用它时将无声地失败。
Ifedi Okonkwo 2014年

97

好了,如果卸载没有被任何机会删除,则可以使用SC.EXE强制删除任何Windows Service。

sc delete <Service_Name>

阅读有关“ MS Techno博客”中的强行删除服务MMC的更多信息。


5
谢谢你 请注意,如果“服务名称”与“显示名称”不同,则可以在服务的属性中获取“服务名称”。
GuiSim 2011年

8
sc delete如果该服务有打开的句柄,还将报告“该服务被标记为删除”。
马特

@GuiSim对此表示感谢,我怀疑很多人会像以前一样输入显示名称!
nik0lai

尝试过但得到以下消息:[SC] DeleteService FAILED 1072:已将指定的服务标记为删除。
Andrew W. Phillips,

37

我知道这无济于事,但将来可能会有所帮助。

我只是遇到了同样的问题,关闭并重新打开服务管理器会从注册表中删除这两项,并完成了服务的卸载。

在此之前,刷新服务经理没有帮助。


1
感谢您的参与。我的经验与您所描述的完全一样。
pk。

10
sc delete sericeName

只需确保服务已停止,然后再执行此操作即可。我大部分时间都看过这项工作。有时我看到窗户卡在某些东西上,并且它坚持要重启。


只是一个补充。.我必须以管理员身份运行我的dos提示符/.NET提示符才能获得运行sc delete命令的访问权限。以防万一其他人遇到该问题。
Dav.id 2012年

在SC DELETE之前运行“ NET STOP <serviceName>”,以确保该服务在删除之前已停止
Adi

这也是我的经验,最终我不得不重新启动以删除仅部分卸载的顽固服务(它仍显示在代码2中的管理单元中)。重新启动是最终使它消失的原因。
delliottg


4

不幸的是,您需要重新启动服务器。那应该删除“已删除”服务。


12
不,您不需要重新启动。见我的解决方案:)
约翰·

2
我实际上更喜欢user186749的解决方案。干净整洁。
麦凯'02

3

万一此答案对某人有所帮助:如此处所示,您可能会避免以管理员身份运行Sysinternals Autoruns的麻烦。只需转到“服务”标签,然后删除您的服务即可。

它在我没有编辑注册表权限的机器上为我解决了问题。


3

您可以手动删除位于的服务的注册表项HKLM\SYSTEM\CurrentControlSet\Services,此后,您将不会在服务控制管理器中看到该服务(需要刷新或重新打开才能看到更改),并且可以照常重新安装该服务。


在Windows 2012 R2上,导致“服务MMC”管理单元(Services.MSC)显示“ 无法读取描述。错误代码:2 ”。尽管确保所有其他MMC都已关闭并且没有其他用户登录。
Signal15

我知道,仅在Windows 8和Windows 10中进行了测试(并且有效)。
费尔南多·冈萨雷斯·桑切斯

终于解决了我的问题。我忘记在项目中添加服务安装程序,并且安装后无法删除我的服务。我建议先导出服务注册表树,然后再删除其中的任何内容。非常感谢!
user3772108

2

以下将在不重新启动机器的情况下起作用:

  1. 在注册表\ HKEY_LOCAL_MACHINE中搜索<您的服务名称>(键和值)
  2. 将“旧版”值设置为0

1

您是否在致电卸载之前尝试停止服务?我随机遇到这个问题。有时我可以将其删除而无需重新启动。我的猜测是它与服务仍在运行有关


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分钟后通知)。


1

这对我有用

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

如果显示的结果是ReturnValue : 16,则命令失败,并显示“ 此服务正在从系统中删除 ”。来自Microsoft的ReturnValues的完整列表在 这里
Signal15年

1

如果你不能停在服务服务,你可以停在你的Windows服务的exe 任务管理器。之后,您可以删除该服务。


0

刷新服务列表总是对我有用。如果服务窗口打开,由于某种原因,它将保留一些现有的内存。F5,我要重新安装!


0

另外,请确保没有可执行文件实例处于活动状态(无论出于何种原因,该实例可能一直在运行,而与服务无关)。

我正在打开和关闭MMC并寻找要杀死的PID-但是在进程浏览器中查看时,有几个现存的进程从一个被遗忘的预定批处理中运行。杀死他们 任务完成。


0

该主题中有很多论坛问题。

我在Windows API中找到了答案。卸载服务后,无需重新启动计算机。您必须致电:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

这关闭了服务的句柄。在Windows 7上,它解决了我的问题。我做:

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

2
如果您不在具有打开手柄的程序中,则在何处关闭手柄?
马特

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

0

还值得注意的是:

sc delete "ServiceName"

在PowerShell中不起作用,sc是PowerShell中cmdlet Set-Content的别名。您需要做:

sc.exe delete "ServiceName"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.