如何强制终止卡在启动阶段的Windows服务进程?
问题描述
启动Windows服务时出现故障:服务持续卡在启动阶段,关联进程无法终止。已知重启服务器可解决问题,但承载业务的服务器不支持高频次重启,且运行环境明确禁止安装、使用Process Explorer类第三方工具软件。
已在管理员权限下尝试多种进程终止操作,均执行失败,返回信息如下:
taskkill /f /pid 7788 ERROR: The process with PID 7788 could not be terminated. Reason: Access is denied. C:\Windows\system32>wmic wmic:root\cli>process where name="ProcesName.exe" delete Delete '\\xxxxx\ROOT\CIMV2:Win32_Process.Handle="7788"' (Y/N/?)? y Deleting instance \\xxxxx\ROOT\CIMV2:Win32_Process.Handle="7788" ERROR: Description = Access denied wmic:root\cli> C:\Windows\system32>wmic wmic:root\cli>process where name="ProcesName.exe" call terminate Execute (\\xxxxx\ROOT\CIMV2:Win32_Process.Handle="7788")->terminate() (Y/N/?)? y Method execution successful. Out Parameters: instance of __PARAMETERS { ReturnValue = 2; }; wmic:root\cli> C:\Windows\system32>taskkill /IM "ProcessName.exe" /T /F ERROR: The process with PID 7788 (child process of PID 680) could not be terminated. Reason: Access is denied. C:\Windows\system32>tasklist | findstr 680 services.exe 680 Services 0 9 084 K java.exe 5832 Services 0 443 680 K
从返回信息可确认,卡住的进程父进程为PID 680的services.exe,属于服务控制管理器托管的服务进程,直接调用用户态进程终止接口返回拒绝访问,本质是当前运行命令的管理员身份权限层级不足,或进程被服务控制管理器的句柄锁定。
解决步骤(全部使用Windows系统自带工具,无需安装第三方软件)
- 优先通过服务控制命令处理,不要直接杀进程
先执行sc queryex找到对应卡住服务的准确服务名,先尝试执行sc stop <你的服务名>下发停止指令。如果停止指令无响应,先执行sc config <你的服务名> start= disabled将服务设为禁用,避免服务控制管理器反复自动拉起进程,再执行sc delete <你的服务名>将服务标记为待删除,断开服务控制管理器对挂死进程的句柄持有。 - 用SYSTEM权限执行进程终止
普通本地管理员权限低于系统服务默认运行的NT AUTHORITY\SYSTEM权限,无法终止同层级权限的进程,可通过系统自带的计划任务功能拉起SYSTEM权限的终止命令,无需第三方工具:- 执行以下命令创建临时计划任务:
schtasks /create /tn "kill_temp" /tr "cmd.exe /c taskkill /f /pid 7788" /sc once /st 00:00 /ru "SYSTEM" /rl HIGHEST - 立即触发任务执行:
schtasks /run /tn "kill_temp" - 等待10秒后执行
tasklist | findstr 7788确认进程是否消失,确认后删除临时任务:schtasks /delete /tn "kill_temp" /f
- 执行以下命令创建临时计划任务:
- 若以上操作仍无法终止,说明进程在内核态持锁挂死
直接运行系统自带的资源监视器resmon.exe,在「CPU」标签页找到PID 7788的进程,展开下方「关联的句柄」列表,找到对应服务关联的锁句柄,右键选择「结束句柄」释放内核锁,之后再执行SYSTEM权限的taskkill命令即可正常终止进程,全程不需要重启服务器。进程终止后如果需要恢复服务,重新注册对应服务、恢复启动类型配置即可。
注意:wmic执行terminate方法返回
ReturnValue=2是标准的权限不足错误,不需要额外排查其他逻辑问题,优先提升执行权限即可解决90%以上的同类问题。
内容的提问来源于stack exchange,提问作者majan
相关产品推荐
相关产品推荐

