我尝试用sc delete <服务名>删除一个Windows服务,并遇到以下错误:

[SC] DeleteService FAILED 1072: 指定的服务已标记为删除。

我已经做了:

Stopped the service, obviously. The sc queryex "<service name>" gives the following result: 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. Due to this removal, services.msc still shows the service (with a name, but no status or startup type), but the description is “<Failed to Read Description. Error Code: 2 >”. When attempting to view the properties, “The system cannot find the file specified.” is shown five times.

问题依然存在。

下一步是什么?


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

SysInternals' Process Explorer is opened. Closing it should lead to automatic removal of the service. Task Manager is opened. Microsoft Management Console (MMC) is opened. To ensure all instances are closed, run taskkill /F /IM mmc.exe. Services console is opened. This is the same as the previous point, since Services console is hosted by MMC. Event Viewer is opened. Again, this is the same as the third point. The key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{service name} exists. Someone else is logged into the server and has one of the previously mentioned applications opened. An instance of Visual Studio used to debug the service is open.


打开Services控制台也可能导致这种情况。直到关闭该服务,Windows才会删除该服务。


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


发现还有一件事要检查-在任务管理器中查看-如果其他用户连接到这个框,即使他们是“断开连接”,你也必须实际签出他们才能让服务最终删除。


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

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

服务应该在那之后就结束了


在我的案例中,它在关闭服务后起了作用。检查服务。如果是,请关闭,并在任务管理器中查看是否有服务进程。


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

尝试以下步骤:

获取服务的进程id Sc queryex <服务名> 用 taskkill /F /PID <业务PID> .使用实例


如果@MainMa提供的步骤不起作用,请执行以下步骤

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

2 .如果以上情况

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


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

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


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

taskkill /F /IM mmc.exe

似乎在Windows 7之后的Windows版本上(未经验证,但根据最新的Windows Server 2012 R2经验),服务控制管理器(SCM)更加严格。

而在Windows 7上,它只是生成另一个进程,它现在正在检查服务进程是否仍然存在,并且可能为任何后续调用CreateService/ deleeservice返回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没有正确地为我们处理这个问题。 编程解决方案比较简单和准确:在停止服务之前获取服务可执行文件的进程句柄,然后等待这个句柄变成有信号的。

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


出现错误的主要原因是进程没有停止。 要解决这个问题,启动任务管理器,转到服务,看看你是否还能看到你的服务,然后转到该服务的进程,结束进程。这样问题就完全解决了。


当我使用应用程序验证器验证我的win服务时,我遇到了这个问题。即使在我关闭App Ver后,我的服务也被阻止删除。只有从App Ver中删除服务才能解决这个问题,并且服务被立即删除。看起来有些进程还在使用你的服务在你试图删除一个之后。


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

(当时的环境是Windows 7。)


以下步骤:

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

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

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

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


这意味着服务在services.msc中仍然被列为禁用。 只要关闭服务。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

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


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

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