身为进程所有者为何无法修改进程DACL,但Process Hacker可正常操作?
核心原因
作为Windows安全对象的所有者,你天生拥有对该对象的READ_CONTROL(读取安全描述符)和WRITE_DAC(修改DACL)隐含权限,该权限不受对象DACL中显式ACE的限制。你遇到的访问拒绝问题来自两个核心原因:
- 你打开进程句柄时请求的权限不足
- 你的程序没有获得足够的运行特权,无法触发所有者隐含权限规则
Process Hacker能正常操作的原因
Process Hacker做了三个关键处理:
- 启动时默认请求管理员最高权限,获取未经过UAC过滤的完整特权令牌,确保令牌中的用户SID和进程所有者SID完全匹配,触发所有者隐含权限
- 程序运行时会自动启用
SeSecurityPrivilege、SeBackupPrivilege、SeRestorePrivilege等高特权,这些特权可以绕过普通DACL权限检查,直接读取和修改任意安全对象的安全描述符 - 打开进程时会请求包含
READ_CONTROL、WRITE_DAC在内的足够权限,因此后续读写DACL的操作不会被拒绝
你代码的问题
你在调用OpenProcess时仅申请了PROCESS_TERMINATE、PROCESS_QUERY_LIMITED_INFORMATION、SYNCHRONIZE三个权限,拿到的进程句柄没有READ_CONTROL和WRITE_DAC权限,调用GetSecurityInfo和SetSecurityInfo时自然会返回访问拒绝错误。
你之前尝试添加READ_CONTROL后OpenProcess报错,是因为你的程序运行在UAC过滤后的普通权限令牌下,管理员组SID被禁用,无法匹配进程所有者SID,触发不了所有者隐含权限规则。
修复方案
- 右键选择「以管理员身份运行」你的程序,确保获得完整特权令牌
- 修改
OpenProcess的权限请求参数,添加READ_CONTROL和WRITE_DAC权限:
HANDLE self = OpenProcess( PROCESS_TERMINATE | PROCESS_QUERY_LIMITED_INFORMATION | SYNCHRONIZE | READ_CONTROL | WRITE_DAC, FALSE, (DWORD) pid);
- 可选操作:在调用
OpenProcess前代码中手动启用SeSecurityPrivilege特权,进一步降低权限检查的限制。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

