sc query 无需管理员权限,可列出所有服务状态但格式不规整;Get-Service 更推荐,支持UTF-8、结构化导出CSV/文本;敏感字段如启动路径需管理员权限配合Get-CimInstance获取。
用 sc query 导出基础服务列表(无权限问题)
普通用户也能执行 sc query,它不依赖管理员权限,适合快速查看服务名、状态和显示名称。但输出是分块格式,不适合直接当表格用。
实操建议:
- 运行
sc query state= all可列出所有服务(包括已停用的),state= active则只列运行中或暂停的服务 - 重定向到文件时加
> services.txt,但注意默认编码是 GBK,若后续用 Python 或 VS Code 打开可能乱码 - 输出里每项以
SERVICE_NAME:和DISPLAY_NAME:开头,没有制表符或逗号分隔,不适合 Excel 直接导入
用 Get-Service 输出结构化文本(推荐 PowerShell)
Get-Service 是更现代的选择,返回对象可自由选择字段、排序、导出为 CSV —— 关键是它默认支持 UTF-8,中文不乱码,且无需管理员权限就能读取服务元数据。
实操建议:
- 导出纯文本(对齐排版):
Get-Service | Sort-Object Status,Name | Format-Table -Property Name,DisplayName,Status -AutoSize | Out-File -FilePath services.txt -Encoding utf8 - 导出 CSV(适合 Excel/Python 处理):
Get-Service | Select-Object Name,DisplayName,Status,StartType | Export-Csv -Path services.csv -NoTypeInformation -Encoding utf8 - 注意
Format-Table生成的是格式化字符串,不是原始对象,所以必须放在管道最后;如果中间还想过滤,先用Where-Object,再Format-Table
导出时绕过“拒绝访问”错误(非管理员查受保护服务)
有些服务(如 SamSs、LSM)即使只是查询状态,sc query 或 Get-Service 也可能报 Access is denied。这不是脚本写错了,是 Windows ACL 限制。
实操建议:
-
Get-Service默认会跳过无法访问的服务并继续执行,不会中断整个命令 —— 这比sc query更鲁棒 - 如果必须拿到全部服务名(哪怕状态未知),可用
Get-CimInstance -ClassName Win32_Service | Select-Object Name,DisplayName,State,StartMode,CIM 接口权限模型略有不同,有时能绕过部分拒绝 - 不要试图在脚本里自动提权(比如加
Start-Process -Verb RunAs),多数服务信息普通用户本就不该访问,强行提权反而暴露安全风险
批量导出含启动路径和服务账户(需管理员权限)
服务的 BinaryPathName(启动命令)和 StartName(运行账户)属于敏感信息,默认不显示。只有管理员才能查到这些字段,且必须换用更底层的接口。
实操建议:
- 用
Get-CimInstance替代Get-Service:Get-CimInstance -ClassName Win32_Service | Select-Object Name,DisplayName,State,StartMode,PathName,StartName | Export-Csv services_full.csv -NoTypeInformation -Encoding utf8 -
PathName字段常带引号和参数,例如"C:\Windows\System32\svchost.exe" -k netsvcs,解析时注意空格和转义 - 导出前建议加
Where-Object { $_.State -ne 'Paused' }过滤掉极少用的暂停态,避免干扰判断

















