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

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

[SC]删除服务失败1072:

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

我已经做了什么:

The problem persists.

What is the next step?

664430 次浏览

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

  1. SysInternals的进程资源管理器被打开

  2. 任务管理器打开

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

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

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

  6. HKEY_LOCAL_MACHINE\SYSTEM\Money tControlSet\Services\{service name}存在。

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

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

这也可能是由于将服务控制台保持打开状态造成的。Windows在关闭服务之前不会实际删除该服务。

在我的情况下,它是由创建事件日志源时未处理的异常引起的。使用try catch来确定原因。

发现还有一件事要检查-查看任务管理器-如果其他用户连接到此框,即使他们“断开连接”,您也必须实际将其注销才能最终删除服务。

按照上面的建议删除注册表项会使我的服务停留在停止状态。以下过程对我有效:

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

服务应该在那之后消失

在我的情况下,它在关闭Services后工作。检查Services.msc是否打开,如果是,关闭它并检查Task Manager中是否找到任何服务进程。

我有同样的问题,最后我决定杀死服务进程。

为此,请尝试以下步骤:

  • 获取服务的进程ID

    sc queryex <service name>

  • 杀死进程

    taskkill /F /PID <Service PID>

如果@MainMa提供的步骤不起作用,请按照以下步骤操作

步骤1尝试从windows任务管理器中杀死进程或使用tasktry /F /PID。您可以通过命令'sc queryex'找到进程的pid。如果您仍然无法卸载,请尝试下一步。

步骤2如果在上面

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

在我的例子中,我执行taskkill /f /im dongleserver.exe, 其中dongleserver.exe是我的程序的exe文件。

然后我就可以重新安装我的程序了。

关闭当前打开的每个窗口,然后运行以下命令,为我解决了这个问题:

taskkill /F /IM mmc.exe

似乎在Windows 7之后的Windows版本上(未经验证,但根据最新的Windows Server 2012 R2经验),服务控制管理器(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的调用中“卡住”,因此它首先对停止控制操作做出反应,但随后必须执行其剩余的代码序列。

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

如果从系统管理的角度处理问题,解决方案也是等待服务进程完全消失。

错误的主要原因是进程没有停止。 要解决它,请启动任务管理器,转到服务,看看您是否仍然能够看到您的服务,然后转到该服务的进程和结束进程。然后问题将完全解决。

当我使用应用程序验证程序来验证我的win服务时,我遇到了这个问题。即使在我关闭App Ver后,我的服务也被阻止删除。只有从App Ver中删除服务才能解决问题,服务才会立即被删除。看起来像是在您尝试删除服务后,某些进程仍在使用您的服务。

这就是我的工作: -我遇到了同样的问题:我的服务被卡在“标记为删除”中。 我打开services.msc 我的服务确实显示为正在运行,尽管它已经卸载。 我点击了停止 收到一条错误消息,表示服务不在接收控制消息的状态。 然而,该服务已停止。 -封闭services.msc. -重新开放services.msc. -服务已消失(不再显示在服务列表中)。

(环境是Windows 7。

要遵循的步骤:

step-1转到位置C:\Windows\Microsoft.NET\Framework\v4.0.30319

step-2运行命令:安装 /u全路径/servicename.exe

step-3关闭服务面板并重新打开它

步骤4运行命令:安装全路径/servicename.exe

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

安装服务路径

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

protected override void OnStop()

停止服务时抛出错误。将东西包装在try catch内将防止标记为删除错误

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

}

这对我有用。

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

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

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

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

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession

按照这里的一些答案的建议关闭服务控制台确实允许我删除服务。在我的场景中,这只是一个短期修复,因为所有后续的重新安装和删除服务都需要我采取这些额外的步骤。查看我的web.config文件,发现有一个错误,一旦修复,允许我轻松删除服务,而无需额外关闭服务控制台步骤。

在我的例子中,服务名称是“监视器”,它也被一个名为“监视器”的Windows服务使用,当我尝试更新我的服务时,我尝试卸载它们,安装程序试图删除Windows服务“监视器”,但它不能,安装总是回滚。

我最终将我的服务重命名为其他东西