windows进程权限控制由四层协同实现:访问令牌决定“你是谁”,完整性级别限制“你能做什么”,服务账户上下文界定“你在哪跑”,对象acl最终裁定“谁准你动它”。
windows 系统对进程的权限控制不是靠单一机制,而是由访问令牌、完整性级别、服务账户上下文和对象级 acl 四层协同完成。普通用户双击运行的程序,默认以中完整性级别(medium il)执行,即使账号是管理员,也不会自动获得高权限——这是 uac 的核心设计。
访问令牌决定“你是谁”
每个进程启动时都会继承一个访问令牌,里面包含用户 SID、所属组、特权列表(如 SeDebugPrivilege)、以及完整性级别标签。这个令牌在登录时生成,后续所有资源访问都以此为依据。
- 用 whoami /all 可查看当前进程完整令牌信息,包括启用的特权和组成员身份
- 管理员账户默认获得的是“过滤令牌”,去掉部分高危特权(如 SeTakeOwnershipPrivilege),除非显式提权
- 调用 CreateProcessAsUser 或 CreateProcessWithTokenW 可以指定不同令牌启动进程,常用于服务或后台任务
完整性级别(IL)限制“你能做什么”
Windows Vista 起引入强制完整性控制(MIC),把进程按可信度分为 Low / Medium / High / System 四档。低完整性进程无法写入中或高完整性对象,哪怕拥有相同用户权限——这是浏览器沙箱、Edge AppContainer 的底层基础。
- 普通桌面程序默认 Medium IL;UAC 提权后为 High IL;系统服务多为 System IL
- 用 icacls 查看文件或注册表项的完整性标签:icacls C:\Windows\System32\drivers\etc\hosts
- 子进程默认继承父进程 IL,无法越级提升;若需降权(如安全浏览),可调用 CreateRestrictedToken 创建受限令牌
服务账户上下文隔离“你在哪跑”
服务不直接以登录用户身份运行,而是绑定特定系统账户,每种账户拥有严格限定的权限边界:
- LocalSystem:最高权限,可访问本机几乎所有资源,但无网络凭据
- LocalService 和 NetworkService:权限受限,分别对应本地服务与网络服务场景
- 自定义域账户:需手动赋予“作为服务登录”权限(SeServiceLogonRight),且建议禁用交互式登录
- 用 sc qc 服务名 查看服务运行账户;用 sc config 服务名 obj= "DOMAIN\user" password= "xxx" 修改(需重启生效)
对象 ACL 实现“谁准你动它”
进程能否操作某个文件、注册表键或另一个进程,最终取决于目标对象的安全描述符(SD)中 DACL 的具体规则。即使进程本身权限很高,若 DACL 显式拒绝,访问仍被拦截。
- 例如 ntoskrnl.exe 默认只允许 NT SERVICE\TrustedInstaller 修改,连 Administrators 组也无写权限
- 用 GetSecurityInfo 获取进程对象的 SD;用 SetSecurityInfo 修改 DACL(需 WRITE_DAC 权限)
- 调试进程需 PROCESS_QUERY_INFORMATION + PROCESS_VM_READ 等细粒度权限,而非简单依赖“管理员”身份











