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
相关产品推荐
相关产品推荐

