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

Win32 AccessCheck结果与实际权限不符的原因及解决方法

Win32 AccessCheck结果与实际操作不符的问题解答

1. 不符情况的原因

  • 复合权限的评估逻辑差异:Modify是包含多个子权限的集合(如DELETE、FILE_ADD_SUBDIRECTORY、WRITE_DAC、WRITE_OWNER等)。AccessCheck判断是否拥有Modify权限时,要求所有子权限都被允许,只要缺一个就会返回无Modify权限。但创建/删除目录仅需要其中个别子权限:创建需要FILE_ADD_SUBDIRECTORY,删除需要目标目录的FILE_DELETE或父目录的FILE_DELETE_CHILD权限。你的场景中,进程已拥有这些必要的单个权限,因此能执行操作,但因缺少Modify包含的其他子权限(如WRITE_DAC),AccessCheck返回无Modify权限。
  • 父目录权限的隐性作用:如果是在C:\Temp下操作子目录,删除权限可能来自C:\Temp自身的FILE_DELETE_CHILD权限(默认配置中Authenticated Users组拥有该权限),而非子目录的Modify权限。此时AccessCheck检查子目录权限自然看不到Modify,但实际操作依赖父目录权限完成。
  • 令牌权限的精准匹配:受限令牌中Administrators组设为SE_GROUP_USE_FOR_DENY_ONLY后,仅会被用于拒绝权限评估,不会影响Authenticated Users组的权限。但Authenticated Users组的Modify权限中,可能部分子权限未被实际授予(或被其他拒绝ACE限制),导致无法满足完整Modify的要求,但不影响单个操作所需的权限。

2. 让AccessCheck准确报告权限的方法

  • 直接检查单个操作所需权限,而非复合权限:
    • 创建目录:检查FILE_ADD_SUBDIRECTORY权限(掩码0x00000004)
    • 删除目录:若删除目标本身,检查FILE_DELETE(掩码0x00010000);若通过父目录删除子对象,检查父目录的FILE_DELETE_CHILD权限(掩码0x00000008)
  • 修正AccessCheck调用参数:
    • 确保传递的安全描述符是目标对象(或父对象,对应FILE_DELETE_CHILD检查)的有效安全描述符
    • 将ACCESS_MASK参数设置为具体的单个权限掩码,而非MODIFY这类复合权限常量
    • 确认使用当前进程的有效令牌,正确处理受限令牌的组标志
  • 纳入父目录权限评估:评估子对象的删除权限时,必须同时检查父目录的FILE_DELETE_CHILD权限,避免忽略Windows权限模型中父目录对子对象操作的控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:33:31