You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

身为进程所有者为何无法修改进程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,触发不了所有者隐含权限规则。

修复方案

  1. 右键选择「以管理员身份运行」你的程序,确保获得完整特权令牌
  2. 修改OpenProcess的权限请求参数,添加READ_CONTROL和WRITE_DAC权限:
HANDLE self = OpenProcess(
  PROCESS_TERMINATE | PROCESS_QUERY_LIMITED_INFORMATION | SYNCHRONIZE | READ_CONTROL | WRITE_DAC,
  FALSE, (DWORD) pid);
  1. 可选操作:在调用OpenProcess前代码中手动启用SeSecurityPrivilege特权,进一步降低权限检查的限制。

内容的提问来源于stack exchange,提问作者Alice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:06:05