可直接通过WMI查询系统服务状态,使用Win32_Service类的State属性判断“Running”或“Stopped”,支持PowerShell、WMIC及远程查询,需注意权限、防火墙与WMI配置。
可以直接通过 wmi 查询系统服务的当前运行状态,无需安装额外工具。wmi 提供了标准类 win32_service,其中 state 属性明确标识服务是“running”、“stopped”还是其他状态。本地或远程均可操作,关键在于权限和命令方式的选择。
使用 PowerShell 快速查看本地服务状态
PowerShell 是最常用且推荐的方式,语法清晰、支持筛选与格式化输出:
- 列出所有服务及其状态:
Get-WmiObject Win32_Service | Select-Object Name, State, StartMode | Sort-Object State - 只显示正在运行的服务:
Get-WmiObject Win32_Service | Where-Object {$_.State -eq 'Running'} | Select-Object Name, DisplayName, StartMode - 从 PowerShell 3.0 起更建议用 CIM 命令(性能更好、兼容性更强):
Get-CimInstance Win32_Service | Where-Object State -eq 'Running' | Format-Table Name, DisplayName, State -AutoSize
使用 WMIC 命令行工具(无需 PowerShell)
WMIC 是轻量级命令行接口,适合快速核查,尤其在受限环境或批处理中使用:
- 查看所有运行中的服务:
wmic service where "State='Running'" get Name, DisplayName, StartMode - 检查特定服务(如 SQL Server 代理)是否运行:
wmic service where "Name='SQLSERVERAGENT'" get Name, State, Status - 导出为 CSV 文件便于分析:
wmic service where "State='Running'" get Name,State,StartMode /format:csv > running_services.csv
查询远程计算机的服务状态
前提是目标机器已启用 WMI 远程访问,并且当前用户具有相应权限(如本地管理员或被授予 ROOT\CIMV2 的“远程启用”权限):
- PowerShell 示例(需提前配置防火墙和 DCOM/WMI 权限):
Get-WmiObject -Class Win32_Service -ComputerName "Server01" | Where-Object State -eq 'Running' - WMIC 示例:
wmic /node:"Server01" service where "State='Running'" get Name,State - 若提示访问被拒绝,需确认:
– 远程主机上 winmgmt 服务正在运行;
– Windows 防火墙允许“Windows Management Instrumentation (WMI)”入站规则;
– 在 wmimgmt.msc → 安全 → ROOT\CIMV2 → 安全性 中为用户勾选“远程启用”。
常见问题与验证要点
WMI 查询结果可能与服务管理器(services.msc)不一致,通常由以下原因导致:
- State 和 Status 区别:State 表示服务当前运行状态(Running/Stopped),Status 是操作可行性(OK/Paused/Unknown),应以 State 为准。
- 权限不足时返回空或报错:本地查询失败可尝试以管理员身份运行 PowerShell 或 CMD;远程查询失败优先检查 WMI 安全配置和网络连通性。
- 服务依赖未启动:某些服务虽设为自动,但因依赖项缺失而无法真正运行,WMI 返回的 State 仍为 Stopped,需结合 Get-Service -DependentServices 进一步排查。











