如何强制卸载 Windows 服务

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

在更新代码之后,我再次使用 installUtil.exe 安装服务 w/o,首先卸载原始版本。

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

如果我试图更改它的属性,我会收到消息“服务被标记为删除”。

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

202779 次浏览

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

在调用卸载之前,是否尝试停止服务?我碰巧遇到了这个问题。有时候我可以不用重启就能移除它。我猜是因为服务还在运行

sc delete sericeName

在执行此操作之前,请确保服务已停止。我已经看过这个作品很多次了。有时候我看到窗口卡在什么东西上,它坚持要重启。

那么,如果卸载不删除的任何机会,你可以使用 SC.EXE 强制删除任何窗口服务。

sc delete <Service_Name>

阅读更多关于“微软技术博客”从服务 MMC 强制删除服务

刷新服务列表总是对我有好处。如果服务窗口是打开的,那么由于某种原因,它将保存一些存在的内存。F5和我再次重新安装!

在过去,有一件事情引起了我的注意,那就是如果您运行了服务查看器,那么就会阻止服务被完全删除,因此要提前关闭它

我知道这不会有帮助,但它可能会帮助某人在未来。

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

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

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

sc.exe queryex <SERVICE_NAME>

然后你会得到一些信息。一个 PID 号码将显示。

taskkill /pid <SERVICE_PID> /f

其中/f 是强制停止。

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

以下内容将在不重新启动机器的情况下工作:

  1. 在注册表 HKEY _ LOCAL _ MACHINE 中搜索 < Your Service Name > (键和值)
  2. 将“ Legacy”值设置为0

关闭 cmd 和服务窗口,如果打开,然后再次启动 cmd 右键单击并选择作为管理员运行。如果 sc delete serviceName不工作或任何东西不工作。

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

还要确保没有可执行文件的实例仍然处于活动状态(也许是一个可能由于某种原因而独立于服务运行的实例)。

我正在打开和关闭 MMC,并寻找要杀死的 PID ——但是在进程资源管理器中,有两个现存的进程正在从一个被遗忘的计划批处理中运行。杀了他们。任务完成。

这个主题有很多论坛问题。

我在 windows api 中找到了答案。卸载服务后不需要重新启动计算机。你必须打电话:

BOOL WINAPI CloseServiceHandle(
SC_HANDLE hSCObject
);

这关闭了服务的把手。在 Windows 7上,它解决了我的问题。 我愿意:

  • 停止服务
  • 关闭手柄
  • 卸载服务卸载服务
  • 等一下
  • 将新的 exe 复制到目录
  • 安装服务
  • 启动服务
  • 关闭手柄

我迟到了,但我想补充一个选择,这可能看起来很奇怪,但我没有看到另一种方式:

当我每天晚上在 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分钟后通知)。

以防万一这个答案对某些人有帮助: 正如发现的 给你一样,您可以省去很多以管理员身份运行 系统内部自动运行的麻烦。 只要去“服务”标签,并删除您的服务。

在一台我没有任何权限编辑注册表的机器上,它为我做到了这一点。

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

当 TopShelf 出现问题或者服务因为其他原因而失败时,我使用下面的 PowerShell,它们是从几个地方拼凑起来的,用于我们的章鱼部署实例。

$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。之后,您可以删除该服务。

还值得注意的是:

sc delete "ServiceName"

Sc 是 PowerShell 中 cmdlet Set-Content 的别名:

sc.exe delete "ServiceName"

这对我很有效:

net stop "MyWindowsService"
taskkill /F /IM mmc.exe
sc delete "MyWindowsService"