服务 SID 与安全描述符是什么
每个 Windows 服务除了名称,还有一个服务 SID,用于在访问控制中标识它。服务的“安全描述符”决定谁能查询、启动、停止、修改这个服务,可以用 sc sdshow 读出 SDDL 文本,用 sc sdset 写回。这是服务层面最小权限加固的核心手段:把启停权限只给需要的账号,而不是默认放开给 Administrators 与 Everyone。
基本信息
| 适用平台 | Windows 全版本(sc 命令,需管理员) |
|---|---|
| 查看 SID | sc showsid <服务名>(本地服务名;也有 UNRESTRICTED 变体) |
| 查看描述符 | sc sdshow <服务名> |
| 写入描述符(整体覆盖) | sc sdset <服务名> <SDDL 字符串> |
| SID 形式 | 服务 SID 形如 S-1-5-80-……(按服务名哈希生成) |
典型使用场景
- 最小权限加固:把启停权限从宽泛组收窄到具体运维账号
- 审计要求:证明服务权限配置符合基线而不是默认值
- 排查“谁改了服务配置”:结合安全描述符与事件日志分析
- 批量服务部署:新服务落地时同步设置权限,避免事后遗漏
- 异常服务排查:确认服务 SID 与预期一致,识别伪装服务
常用示例
常用示例
:: 查看服务 SID
sc showsid MySvc
:: 查看当前安全描述符(SDDL 文本)
sc sdshow MySvc
:: 改动前务必先备份现状
sc sdshow MySvc > D:\MySvc_sddl_backup.txt
:: 写入新的安全描述符(整体覆盖语义)
sc sdset MySvc D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
:: 改完立即验证服务可启动
sc start MySvc
sc query MySvcSDDL 常见片段
| 片段 | 含义 | 用途 |
|---|---|---|
| D: | DACL 起始 | 其后为允许/拒绝条目 |
| (A;;…;;;SY) | 允许 SYSTEM 的权限集 | 服务正常运行必需 |
| (A;;…;;;BA) | 允许内置管理员组 | 运维与管理 |
| (A;;RPWP;;;组SID) | 允许启停服务的权限位 | 把启停权限授予特定账号 |
| (D;;…) | 拒绝条目 | 谨慎使用,整体覆盖语义下影响面大 |
sc sdset 是整体替换而不是追加:新 SDDL 里漏掉的条目会直接消失,写错会导致服务无法启动甚至无法查询。正确顺序永远是先 sc sdshow 备份、再改、再立刻 sc start 验证。
SDDL 里同一类权限在不同对象上的含义不同(服务、文件、注册表各有映射表)。改造前先确认权限位对应的具体能力,不要照抄网上示例里的字符串。
服务 SID 由服务名派生,重命名服务会改变服务 SID;如果环境里用服务 SID 做过授权,改名前要先评估连带影响。