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

Posted

技术标签:

【中文标题】如何解决“指定的服务已被标记为删除”错误【英文标题】:How to solve "The specified service has been marked for deletion" error 【发布时间】:2013-12-31 22:55:57 【问题描述】:

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

[SC] 删除服务失败 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              :

Ensured that Microsoft Management Console is closed (taskkill /F /IM mmc.exe),

Ensured that Event Viewer is closed,

Removed the key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<service name> from the registry.

由于此次删除,services.msc 仍然显示服务(有名称,但没有状态或启动类型),但描述为“”。尝试查看属性时,“系统找不到指定的文件。”显示五次。

问题依然存在。

下一步是什么?

【问题讨论】:

重新启动通常会清除任何挥之不去的状态。 我知道。但我想到了一个不太激进的解决方案。就我而言,每天重启 30 次不是一个可接受的解决方案。 “你为什么要定期删除服务?”:我正在写一个 Windows 服务。每次编译时,都应该重新启动。 “但是每天在注册表中进行 30 次黑客攻击是可以接受的吗?”:完全可以。从注册表中删除一个键并不强制我保存所有内容,关闭每个打开的应用程序,等待一分钟,然后重新打开所有内容。 我写过windows服务。除非您更改执行注册的实际代码,否则每次构建时都无需卸载并重新安装它。只要路径不变,旧的注册信息仍然有效。 @NickTurner - 链接到任何错误报告?无论您指的是什么错误,我都没有遇到过。而且我不确定 MSI 是如何参与的,因为我们大概是在谈论在开发机器上构建和运行服务(至少这似乎是这个 5 年前的问题的上下文) 【参考方案1】:

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

    SysInternals' Process Explorer is opened。关闭它应该会导致服务自动删除。

    Task Manager is opened.

    Microsoft Management Console (MMC) is opened。要确保所有实例都已关闭,请运行 taskkill /F /IM mmc.exe

    Services console is opened。这与上一点相同,因为服务控制台由 MMC 托管。

    Event Viewer is opened。同样,这与第三点相同。

    The key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\service name exists.

    Someone else is logged into the server 并打开了前面提到的应用程序之一。

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

【讨论】:

任务管理器似乎也是如此。如下所述,让服务控制台保持打开状态也可能导致这种情况。 ...如果关闭所有这些仍然无济于事,并且您仍然看到服务“标记为删除”,请简单注销而不是完全重启。它帮助了我几次。 关闭服务控制台为我解决了这个问题!我的过程如下:在 VS2012 x64 Native Tools 命令提示符中 --> 导航到具有服务可执行文件的目录 --> installutil /u servicename.exe(卸载过时的服务) --> 复制新构建的服务exe --> installutil servicename.exe(安装更新的服务)。我通常可以立即卸载并重新安装,没有任何问题。直到我随机不能。关闭服务控制台解决了它。感谢您的提示! 在我看来,Process Explorer 是这里最大的一个。我建议将其加粗和/或将其移至列表顶部。 除此之外,我必须运行sc stop "Task Name" 并等待错误消息,直到sc delete 工作。【参考方案2】:

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

【讨论】:

正如我在问题中指出的那样,在测试期间“Microsoft 管理控制台已关闭”。 就我而言,服务控制台是问题所在。一旦我关闭它并重新打开它,已删除的服务就消失了。 很难相信保持窗口打开是这种情况......谢谢! 这对我也有用,尽管奇怪的是在很多情况下只需按 F5 即可刷新列表并删除服务。 你拯救了我的一天【参考方案3】:

在我的情况下,它是由创建 eventLog 源时未处理的异常引起的。使用 try catch 找出原因。

【讨论】:

【参考方案4】:

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

【讨论】:

不必要的。您只需确保每个人都退出 Microsoft 管理控制台 (MMC) 和服务控制面板。【参考方案5】:

按照上面的建议删除注册表项使我的服务陷入停止状态。以下程序对我有用:

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

服务应该在那之后消失

【讨论】:

【参考方案6】:

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

【讨论】:

它为我工作!服务进程还在任务管理器中徘徊,我先关闭了服务控制台,然后从任务管理器中删除了服务进程。然后重新打开服务控制台,看到服务消失了! 这也是我的罪魁祸首,如果它不起作用,我会在关闭 Visual Studio 时进行测试。【参考方案7】:

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

请尝试以下步骤:

获取服务的进程ID

sc queryex &lt;service name&gt;

杀死进程

taskkill /F /PID &lt;Service PID&gt;

【讨论】:

我的 PID 是 0,所以我最好不要杀死它! 您可以为它卸载服务,请执行以下步骤 1- 运行 cmd 2- 将方向更改为服务的 .exe 文件找到该 3- 执行命令 installutil /u +1 for sc queryex 如果我想附加调试器,我将能够使用它来获取 PID 推荐使用管理员模式的命令提示符。【参考方案8】:

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

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

第 2 步如果以上

运行Autoruns for Windows 按名称搜索服务并删除结果。

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

taskkill /F /IM mmc.exe

【讨论】:

【参考方案11】:

似乎在 Windows 7 之后的 Windows 版本上(未经验证,但根据最新的 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 状态后仍然存在的原因并不奇怪。这是一个常规进程,其主线程在调用StartServiceCtrlDispatcher API 时“卡住”了,因此它首先对停止控制操作做出反应,然后必须执行其剩余的代码序列。

很遗憾,SCM/OS 没有为我们正确处理这个问题。 编程解决方案有点简单而准确:在停止服务之前获取服务可执行文件的进程句柄,然后等待该句柄变为信号。

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

【讨论】:

【参考方案12】:

错误的主要原因是进程没有停止。 要解决它,请启动任务管理器转到服务,看看您是否仍然能够看到您的服务,而不是转到该服务的进程并结束进程。这样问题就彻底解决了。

【讨论】:

【参考方案13】:

我在使用 Application Verifier 验证我的 win 服务时遇到了这个问题。即使在我关闭 App Ver 之后,我的服务也被阻止删除。只有从 App Ver 中删除服务才能解决问题,并且服务被立即删除。在您尝试删除某个进程后,似乎某个进程仍在使用您的服务。

【讨论】:

【参考方案14】:

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

(环境是Windows 7。)

【讨论】:

这里是Windows 2008,我只好关闭服务面板【参考方案15】:

要遵循的步骤:

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

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

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

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

【讨论】:

附注:installutil 只能以管理员身份工作,因此请以管理员身份打开 shell。 当我的服务最终处于标记为删除状态并且我无法使用此处的任何其他解决方案删除其注册时,这对我有用!【参考方案16】:

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

installutil“服务路径”

【讨论】:

有史以来最简单的解决方案 :) 我只需要重新打开我的 services.msc,它就消失了。谢谢!【参考方案17】:

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

protected override void OnStop()

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

protected override void OnStop()

            try
            
                //things to do
            
            catch (Exception)
            
            

【讨论】:

【参考方案18】:

这对我有用。

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

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

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

【讨论】:

【参考方案19】:

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

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

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

在我的情况下,服务名称是“监视器”,它也被称为“监视器”的 Windows 服务使用,当我尝试更新我的服务时,我尝试卸载它们,安装程序试图删除 Windows 服务“监视器” ' 它不能,并且安装总是回滚。

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

【讨论】:

以上是关于如何解决“指定的服务已被标记为删除”错误的主要内容,如果未能解决你的问题,请参考以下文章

"SQL SERVER,错误:207" 如何解决

c#Ajax 的错误,应该如何解决?

如何解决子重复错误?

如何解决“错误:输入中的语法错误(1)。”

如何解决此分段错误:以下代码的 11 错误?

RichEmbed 未定义错误如何解决