如何解决“指定的服务已被标记为删除”错误


584

我尝试使用删除Windows服务sc delete <service name>,并遇到以下错误:

[SC] DeleteService失败1072:

指定的服务已标记为删除。

我已经完成的工作:

问题仍然存在。

你下一步怎么做?


4
重新启动通常应清除所有残留状态。
Damien_The_Unbeliever 2013年

14
我知道。但是我想到了一个不太激进的解决方案。对于我来说,每天重启三十次将不是可接受的解决方案。
阿森尼·穆尔琴科

54
“为什么要定期删除服务?” :我正在编写Windows服务。每次编译时,都应重新启动。“但是每天在注册表中进行30次黑客攻击是可以接受的吗?” :完全。从注册表中删除密钥并不会迫使我保存所有内容,关闭每个打开的应用程序,等待一分钟然后重新打开所有内容。
阿森尼·穆尔琴科

46
我已经写了Windows服务。除非您更改执行注册的实际代码,否则每次执行构建时都无需卸载并重新安装它。只要路径仍然相同,旧的注册信息仍将有效。
Damien_The_Unbeliever 2013年

4
@NickTurner-链接到任何错误报告吗?无论您指的是什么错误,我都没有遇到过。而且我不确定MSI是如何参与的,因为我们大概是在谈论在开发机上构建和运行服务(至少似乎是这个具有5年历史的问题的上下文)
Damien_The_Unbeliever

Answers:


1243

可能有多种原因导致服务卡在“标记为删除”中。

  1. SysInternals的Process Explorer打开。关闭它会导致服务自动删除。

  2. 任务管理器已打开

  3. Microsoft管理控制台(MMC)已打开。要确保关闭所有实例,请运行taskkill /F /IM mmc.exe

  4. 服务控制台已打开。这与上一点相同,因为Services控制台由MMC托管。

  5. 事件查看器已打开。同样,这与第三点相同。

  6. 密钥HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {服务名称}存在

  7. 其他人登录到服务器,并打开了前面提到的应用程序之一。

  8. 用于调试服务的Visual Studio实例已打开。


9
任务管理器似乎也是如此。如下所述,将服务控制台保持打开状态也可能导致此情况。
CodingBarfield 2014年

4
...并且如果关闭所有这些操作仍然无济于事,并且您仍然看到该服务被标记为“已删除”,请简单注销而不是完全重新启动。它帮助了我几次。
Nedko 2014年

2
一种常见的工作流程:您邪恶的同事也都已登录到远程服务器,并且所有人都打开了某些文件……
Chris O

72
关闭服务控制台为我解决了这个问题!我的过程如下:在VS2012 x64本机工具命令提示符中 -> 导航到具有服务可执行文件的目录 -> installutil / u servicename.exe(以卸载过时的服务) -> 复制了新的内置服务的exe - > installutil servicename.exe(以安装更新的服务)。我通常可以立即卸载并重新安装,没有任何问题。直到我随机不能。关闭服务控制台即可解决。谢谢你的提示!
thehelix 2014年

17
在我看来,Process Explorer是这里的佼佼者。我建议将其加粗和/或将其移到列表的顶部。
Coxy 2015年

221

这也可能是由于打开服务控制台导致的。在关闭服务之前,Windows实际上不会删除该服务。


3
正如我在问题中指出的那样,在测试过程中“ Microsoft管理控制台已关闭”。
2014年

25
就我而言,服务控制台就是问题所在。一旦我关闭并重新打开它,删除的服务就会消失。
Farrukh Najmi 2014年

3
很难相信会一直打开窗户……谢谢!
卡罗尔·泰尔

这对我也起作用,尽管奇怪的是,在很多情况下,只需按F5键即可刷新删除服务的列表。
史蒂夫·史密斯

1
您救了我的一天
Pranoy Sarkar

48

我遇到了同样的问题,最后我决定终止服务过程。

为此,请尝试以下步骤:

  • 获取服务的进程ID

    sc queryex <service name>

  • 杀死进程

    taskkill /F /PID <Service PID>


2
我的PID是0,所以我最好不要杀死它!
抢劫

您可以按照以下步骤执行以下操作卸载服务:1-运行cmd 2-更改服务的.exe文件方向,找到该3-执行命令installutil / u <yourfilename.exe>
Ali Sadri

对于sc queryex +1,如果我想附加调试器,我将能够使用它来获取PID
Paul McCarthy

44

就我而言,它在关闭Services。检查是否Services.msc已打开,如果是,则将其关闭,并检查中是否有任何服务过程Task Manager


13

这意味着该服务在services.msc中仍被列为禁用。只需关闭services.msc并以管理员身份重新打开即可。该服务不会列出。现在,使用以下命令安装服务:

installutil“服务路径”


11

如上所述删除注册表项会使我的服务陷入停止状态。以下过程对我有用:

打开任务管理器>选择服务选项卡>选择服务>右键单击并选择“转到流程”>右键单击该流程,然后选择“结束流程”

在那之后服务应该消失了


7

发现了另一项要检查的内容-在任务管理器中查找-如果其他用户已连接到此框,即使他们已“断开连接”,您也必须实际注销他们才能最终删除该服务。


4
不必要。您只需要确保每个人都退出Microsoft管理控制台(MMC)和服务控制面板即可。
罗恩侯爵

6

在Windows版本晚于Windows 7(未经验证,但根据Windows Server 2012 R2的最新经验)看来,服务控制管理器(SCM)更加严格。

在Windows 7上,它只是产生了另一个进程,现在它正在检查服务进程是否仍然存在,并且即使服务似乎已停止,对于随后对CreateService / DeleteService的任何后续调用也可能返回ERROR_SERVICE_MARKED_FOR_DELETE(1072)。

我在这里说的是Windows API代码,但我想清楚地概述正在发生的事情,因此此顺序可能导致提到的错误:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

在已经报告了SERVICE_STOPPED状态之后,服务进程仍然存在的原因并不奇怪。这是一个常规过程,其主线程在对StartServiceCtrlDispatcherAPI的调用中被“卡住” ,因此它首先对停止控制动作做出反应,但随后必须执行其剩余的代码序列。

不幸的是,SCM / OS无法为我们正确处理此问题。编程解决方案有点简单而准确:在停止服务之前获取服务可执行文件的进程句柄,然后等待该句柄发出信号。

如果从系统管理的角度解决问题,解决方案还应等待服务过程完全消失。


6

这对我有用:-我遇到了同样的问题:我的服务被卡在“标记为删除”中。-我打开了services.msc我的服务确实显示为正在运行,尽管它已被卸载。-我单击“停止”,收到一条错误消息,说该服务未处于接收控制消息的状态。但是,该服务已停止。-关闭service.msc。-重新打开了services.msc。-服务已消失(不再显示在服务列表中)。

(环境是Windows7。)


2
Windows 2008在这里,我不得不关闭服务面板
Mathijs Segers'7

5

就我而言,我执行taskkill /f /im dongleserver.exe,其中dongleserver.exe程序的exe文件。

这样我就可以重新安装程序了。


4

就我而言,这是由创建eventLog源时未处理的异常引起的。使用try catch查明原因。



3

如此处的一些答案所示,关闭服务控制台确实使我可以删除该服务。在我的情况下,这只是短期修复,因为所有后续重新安装和删除服务都需要我执行这些附加步骤。查看我的web.config文件后,发现存在一个错误,该错误一旦修复,就可以轻松删除服务,而无需另外关闭服务控制台步骤。


1

这对我有用。

  • 打开任务管理器
  • 选择服务标签
  • 选择有问题的服务
  • 右键单击并选择“转到详细信息”
  • 右键单击该服务,然后选择“结束进程树”

结束进程树将结束该进程以及该进程创建的所有进程。

然后,您可以重新安装该服务。


1

就我而言,服务名称为“ Monitor”,它也被称为“ Monitor”的Windows服务使用,当我尝试更新服务时,我尝试将其卸载,安装程序尝试删除Windows服务“ Monitor”,不能,并且安装总是回滚。

我最终将服务重命名为其他内容


0

如果@MainMa提供的步骤无效,请执行以下步骤

步骤1尝试从Windows Task Manager或使用taskkill / F / PID终止进程。您可以通过命令“ sc queryex”找到该进程的pid。如果仍然无法卸载,请尝试下一步。

步骤2如果以上

运行Windows自动运行功能按名称搜索服务并删除结果。


0

该错误的主要原因是进程未停止。要解决该问题,请启动任务管理器转到服务,然后查看您是否仍然可以看到您的服务,然后转到该服务的过程和结束过程。比这个问题将得到彻底解决。


0

当我使用Application Verifier验证我的Win服务时遇到了这个问题。即使我关闭了App Ver后,我的服务也被禁止删除。仅从App Ver中删除服务即可解决此问题,并且服务已被立即删除。尝试删除某个服务后,似乎某些进程仍在使用您的服务。


0

遵循的步骤:

步骤1转到位置C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319

步骤2运行命令:installutil / u full-path / servicename.exe

第三步关闭服务面板并重新打开

步骤4运行命令:installutil full-path / servicename.exe


1
旁注:installutil仅以管理员身份运行,因此请以管理员身份打开外壳。
ingconti

0

很有可能删除服务失败,因为

protected override void OnStop()

停止服务时引发错误。将内容包装在try catch中将防止标记为删除错误

protected override void OnStop()
{
            try
            {
                //things to do
            }
            catch (Exception)
            {
            }

}


0

有时在通过PowerShell远程会话脚本删除服务的过程中可能会发生这种情况,尤其是当您尝试多次删除服务时。在这种情况下,请尝试在删除之前重新创建会话:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
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.