Writing
Windows 服务启动设置:先分清启动、依赖和触发
说明 Windows 服务的启动类型、依赖关系、触发启动和服务控制管理器,并给出以查询为主的核对路径。
打开服务列表,看到一排“手动”和“已停止”,并不需要把它们全部改成自动。部分服务原本就按需运行;另一些服务虽然配置为自动,却可能在初始化时失败。先查明是哪一种情况。
自动启动,不保证一直运行
服务控制管理器(SCM)维护已安装服务的数据库,保存可执行路径、账户、启动配置和控制权限,并负责启动、停止和状态转换。微软对 SCM 与服务机制的说明 很清楚:服务适合需要长期驻留或响应系统事件的后台工作,但不同场景并不都要开机常驻。
常见启动类型可以先按意图理解。自动启动适合必须在系统启动后持续可用的组件;自动(延迟启动)把一部分工作放到开机初期之后,减少启动阶段的竞争;手动启动表示由程序、依赖项或管理员在需要时启动;禁用则阻止 SCM 启动该服务。服务列表里显示的“手动”不表示它永远不会运行,显示“自动”也不表示它已经成功运行。
启动类型描述的是 SCM 可以在什么时机启动服务,并不替代服务自己的初始化逻辑。服务进程启动后仍可能因为配置文件、端口、证书、账户权限或下游服务不可用而立即退出。因此,看到自动服务处于 stopped 时,先查最近一次启动结果和事件,比立刻改启动类型更有信息量。
查询依赖和实际配置
一个自动启动服务若依赖于手动服务,系统启动时仍可能先拉起被依赖的服务。反过来,直接停掉某个基础服务,往往会影响一串上层服务。微软的 Automatically Starting Services 说明了启动时会处理自动服务及其依赖项,加载组、组内顺序和依赖关系都会参与顺序安排。
先做只读检查通常足够:
Get-Service -Name W32Time | Format-List Name, Status, StartType
sc.exe qc W32Time
sc.exe queryex W32Time
把 W32Time 替换为实际服务名。Get-Service 适合快速看状态和启动类型;sc qc 能看二进制路径、启动账户与依赖;sc queryex 会补充状态和进程标识。不要只按显示名称搜索,也不要从网上抄一条 sc config 就执行。不同 Windows 版本、角色和软件安装状态下,同名服务的合理配置可能不同。
如果服务由某个软件安装,先在软件自身的管理界面或文档中确认它的用途。系统服务、驱动服务和第三方服务的恢复方式并不相同;把第三方服务改成系统默认值,或把系统服务按第三方教程禁用,都可能留下比原问题更难解释的状态。
手动服务也可能被事件拉起
部分服务会响应设备到达、IP 地址变化、加入域或防火墙端口事件。SCM 按注册的触发器执行启动或停止动作,服务不必始终常驻。这里的端口事件不是一次远程连接测试,也不能用“网络通了”推断触发器一定发生。Service Trigger Events 列出了支持的事件类型。一个服务刚好处于 stopped,可能只是尚未等到相应事件。
查看触发器可以使用:
sc.exe qtriggerinfo W32Time
用事件区分没启动和启动失败
触发器查询反映的是配置,实际发生了什么还要看事件查看器中的 System 日志。也可以在有日志读取权限的 PowerShell 中查最近两小时的 SCM 事件:
Get-WinEvent -FilterHashtable @{
LogName = 'System'
ProviderName = 'Service Control Manager'
StartTime = (Get-Date).AddHours(-2)
} -MaxEvents 20 | Select-Object TimeCreated, Id, Message
没有匹配事件时命令会报找不到事件,不等于 SCM 损坏。若看到登录失败,查服务账户;若是依赖失败,先查被依赖项;超时则需继续看服务自己的日志。SCM 的状态报告过程见 Service Startup。
真要调整启动方式时,留下原始配置、调整理由和恢复方法,再安排维护窗口。尤其是域成员的时间、网络和安全服务,不宜照着通用“提速清单”逐项禁用。