Ars*_*nko 534 windows-services
我尝试删除Windows服务sc delete <service name>,并遇到以下错误:
[SC] DeleteService FAILED 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 :
Run Code Online (Sandbox Code Playgroud)确保Microsoft管理控制台已关闭(taskkill /F /IM mmc.exe),
从注册表中删除了密钥HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<服务名称>.
由于此删除,services.msc仍显示服务(具有名称,但没有状态或启动类型),但描述为"<无法读取描述.错误代码:2>".尝试查看属性时,"系统找不到指定的文件."会显示五次.
问题依然存在.
你下一步怎么做?
Ars*_*nko 1153
导致服务陷入"标记为删除"的原因可能有多种.
SysInternals的Process Explorer已打开.关闭它应该导致自动删除服务.
Microsoft管理控制台(MMC)已打开.要确保关闭所有实例,请运行taskkill /F /IM mmc.exe.
服务控制台已打开.这与前一点相同,因为服务控制台由MMC托管.
事件查看器已打开.同样,这与第三点相同.
密钥HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{service name}存在.
其他人登录到服务器并打开了前面提到的应用程序之一.
用于调试服务的Visual Studio实例已打开.
小智 204
这也可以通过使服务控制台保持打开状态来实现.在关闭服务之前,Windows实际上不会删除该服务.
Ali*_*dri 42
嗨伙计们我有同样的问题,最后我决定杀死服务流程.
尝试以下步骤:
获取服务的进程ID
sc queryex <service name>
杀戮过程
taskkill /F /PID <Service PID>
Gat*_*ign 13
按照此处的一些答案的建议关闭服务控制台确实允许我删除该服务。在我的情况下,这只是一个短期修复,因为所有后续重新安装和删除服务都需要我采取这些额外的步骤。查看我的 web.config 文件,发现有一个错误一旦修复,我就可以轻松删除服务,而无需额外关闭服务控制台步骤。
Ame*_*aik 10
这意味着该服务仍然在services.msc中列为已禁用.只需关闭services.msc并以管理员身份重新打开...该服务将不会列出.现在,使用命令安装服务,
installutil"服务之路"
小智 7
发现还有一件事需要检查 - 查看任务管理器 - 如果其他用户连接到此框,即使他们"断开连接",您也必须实际签署它们以使服务最终删除.
似乎在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
Run Code Online (Sandbox Code Playgroud)
服务流程在已经报告其SERVICE_STOPPED状态之后仍然存在的原因并不令人惊讶.这是一个常规进程,其主要线程在其对StartServiceCtrlDispatcherAPI的调用中"卡住" ,因此它首先响应停止控制操作,但随后必须执行其剩余的代码序列.
有点不幸的是,SCM/OS没有为我们正确处理这个问题.程序化解决方案有点简单和准确:在停止服务之前获取服务可执行文件的进程句柄,然后等待此句柄发出信号.
如果从系统管理角度处理问题,解决方案也是等待服务进程完全消失.
这对我有用: - 我遇到了同样的问题:我的服务陷入'标记为删除'. - 我打开了services.msc我的服务确实显示为正在运行,虽然它已经被卸载了. - 我点击停止收到错误消息,说该服务未处于接收控制消息的状态.然而,服务已经停止. - 封闭式服务.msc. - 重新开放的服务.msc. - 服务已经消失(不再显示在服务列表中).
(环境是Windows 7.)