如何解决“指定的服务已被标记为删除”错误
我尝试用sc delete <service name>
Windows服务,并遇到以下错误:
[SC] DeleteService失败1072:
指定的服务已被标记为删除。
我已经做了什么:
-
显然,停止服务。
sc queryex "<service name>"
给出以下结果:SERVICE_NAME: Stub service TYPE : 10 WIN32_OWN_PROCESS STATE : 1 STOPPED WIN32_EXIT_CODE : 1067 (0x42b) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 PID : 0 FLAGS :
-
确保Microsoft Management Console已closures (
taskkill /F /IM mmc.exe
), -
确保事件查看器已closures ,
-
从registry中删除键HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ <服务名称> 。
由于此删除,
services.msc
仍显示该服务(具有名称,但没有状态或启动types),但描述为“<读取失败说明。 错误代码:2>“。 试图查看属性时,“系统找不到指定的文件”显示五次。
问题依然存在。
你下一步怎么做?
可能有几个原因导致服务卡在“标记为删除”中。
-
SysInternals的Process Explorer打开 。 closures它应该导致服务的自动删除。
-
任务pipe理器已打开 。
-
Microsoftpipe理控制台(MMC)已打开 。 要确保closures所有实例,请运行
taskkill /F /IM mmc.exe
。 -
服务控制台打开 。 这与以前的观点相同,因为服务控制台由MMC托pipe。
-
事件查看器已打开 。 再一次,这和第一点是一样的。
-
键HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {服务名称}存在 。
-
其他人login到服务器,并有一个前面提到的应用程序打开。
-
打开用于debugging服务的Visual Studio实例。
这也可能是由于打开服务控制台造成的。 Windows将不会实际删除该服务,直到它被closures。
在我的情况下,它closuresServices
后工作。 检查Services.msc
是否打开,如果是,closures它并检查在Task Manager
find的任何服务进程。
嗨,大家好,我有同样的问题
最后,我决定杀死服务过程
因为它尝试下面的步骤
1-获得服务的ID
sc queryex <service name>
2千位与
taskkill / F / PID <Service PID>
如上所示删除registry项让我的服务停留在停止状态。 以下程序适用于我:
打开任务pipe理器>select服务选项卡>select服务>右键单击并select“去处理”>右键单击该进程并select结束进程
服务应该在此之后消失
在我的情况下,它是由创buildeventLog源时未处理的exception引起的。 使用try catch来指出原因。
发现另外一件事要检查 – 看看任务pipe理器 – 如果其他用户连接到这个盒子,即使他们是“断开”,你必须实际签署他们的服务,最终删除。
在我的情况下,我执行taskkill /f /im dongleserver.exe
,其中dongleserver.exe
是我的程序的exe文件。
然后我可以重新安装我的程序了。
在Windows 7之后的版本(未经validation,但是由Windows Server 2012 R2的最新经验)看来,服务控制pipe理器(SCM)更为严格。
在Windows 7上,它只是产生另一个进程,现在正在检查服务进程是否还在,并且可能返回ERROR_SERVICE_MARKED_FOR_DELETE(1072),以便后续调用CreateService / DeleteService,即使该服务似乎已停止。
我在这里说的是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状态之后,服务进程依然存在的原因并不奇怪。 这是一个常规的进程,其主线程在调用StartServiceCtrlDispatcher
API时“卡住”,所以它首先对停止控制动作作出反应,但是必须执行其余的代码序列。
单片机/操作系统不能很好地处理这个问题,这是很不幸的。 程序化的解决scheme有点简单和准确:在停止服务之前获取服务可执行程序的进程句柄,然后等待此句柄变成信号。
如果从系统pipe理的angular度来解决这个问题,解决scheme也是等待服务过程完全消失。
这是对我有用的: – 我遇到了同样的问题:我的服务被卡在“标记为删除”。 – 我打开services.msc我的服务确实显示为正在运行,虽然它已经被卸载。 – 我点击停止接收到错误消息,说服务不处于接收控制消息的状态。 尽pipe如此,这项服务已经停止。 – closuresservices.msc。 – 重新打开services.msc。 – 服务不见了(不再显示在服务列表中)。
(环境是Windows 7)
closures当前打开的每个窗口,然后运行以下命令解决了我的问题:
taskkill /F /IM mmc.exe
如果@MainMa提供的步骤不起作用,请遵循以下步骤
步骤1尝试从Windows任务pipe理器或使用taskkill / F / PID查杀进程。 你可以通过命令“sc queryex”find进程的pid。 如果仍然无法卸载,请尝试下一步。
第2步如果以上
运行Windows的自动search按名称search服务并删除结果。
错误的主要原因是进程没有停止。 解决它启动任务pipe理器去服务,看看你是否仍然能够看到你的服务,比去那个服务和结束进程的过程。 比问题将完全解决。
我在使用Application Verifiervalidation我的win服务时遇到此问题。 即使我closures了应用程序版本我的服务被阻止删除。 只有从App Ver中删除服务解决了问题,并立即删除服务。 看起来像一些过程仍然使用您的服务后,你试图删除一个。