Windows 也要“运行即必要”
Windows 服务的攻击面不比 Linux 小:历史漏洞常出现在打印、远程注册表、SMB 相关服务上,而很多服务器在装完业务后仍留着这些默认组件。核查方法是导出运行中与自动启动的服务清单,逐项与批准清单比对;对路径不在系统目录、启动账号异常、显示名与注册表名不一致的项重点排查,这些通常是第三方软件、历史遗留或被攻击者注册的持久化服务。
基本信息
| 加固项 | 服务与启动项最小化 |
|---|---|
| 适用平台 | Windows 10/11、Windows Server |
| 权限要求 | 本地管理员 |
| 达标判据 | 运行中与自启服务均有业务归属,无未授权服务 |
| 输出物 | 服务清单 CSV,纳入配置基线用于 diff |
典型使用场景
- 新交付服务器的服务清点与收敛
- 等保与 CIS 核查“最小服务”条款取证
- 排查偶发性能问题时确认有无多余服务占用资源
- 安全事件排查:寻找新增的可疑服务与启动项
- 变更后 diff 清单,发现被悄悄改动的启动类型
运行中服务清单
运行中服务清单
Get-Service | Where-Object {$_.Status -eq 'Running'} | Sort-Object DisplayName | Format-Table -AutoSize
Get-CimInstance Win32_Service | Where-Object {$_.StartMode -eq 'Auto'} | Select-Object Name, DisplayName, StartMode, StartName, State | Sort-Object Name | Export-Csv C:\temp\services-auto.csv -NoTypeInformation -Encoding UTF8
Get-Service | Where-Object {$_.Status -eq 'Stopped' -and $_.StartType -eq 'Automatic'} # 启不来的自启服务:可能是残留或配置错误异常服务排查线索
异常服务排查线索
Get-CimInstance Win32_Service | Where-Object {$_.PathName -notlike 'C:\Windows\*'} | Select-Object Name, PathName, StartName | Format-Table -Wrap
Get-CimInstance Win32_Service | Where-Object {$_.StartName -notlike 'NT AUTHORITY\*' -and $_.StartName -notlike 'LocalSystem'} | Select-Object Name, StartName # 以普通账号或域账号运行的服务
Get-CimInstance Win32_Service | Where-Object {$_.PathName -match 'Temp|Users|ProgramData'} # 路径落在可写目录的服务,警惕持久化逐列读法与判读
| 字段 | 含义 | 异常表现 |
|---|---|---|
| Name | 注册表名(服务键名) | 脚本比对要用它,显示名不可靠 |
| DisplayName | 界面显示名 | 可被随意修改,不能作为唯一标识 |
| StartMode | Auto/Manual/Disabled | 业务不需要却为 Auto,属待收敛项 |
| StartName | 运行账号 | 以域账号或普通用户运行需核实必要性 |
| PathName | 可执行文件路径 | 落在 Temp、Users、ProgramData 等可写目录需重点排查 |
把清单导出成 CSV 纳入配置基线,新装机器或变更后做一次 diff,异常服务会立刻现形。相比每次人工翻服务列表,基线比对能发现“启动类型从 Manual 被改成 Auto”这类容易被忽略的变化。
处置时不要凭名字判断:“不认识就关”可能停掉业务依赖的守护服务或安全软件的代理进程。稳妥流程是先确认服务对应的软件包与发布方、查看依赖关系与服务日志,再决定停用还是保留,并在变更记录里写明原因。