我想检查文件ACL中是否严格提及 Everyone 用户组,以及该组中的任何用户是否可以访问此文件,例如用于写操作 .
要实现这一点,我正在寻找 Everyone 组SID:
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
dwRes = AllocateAndInitializeSid(
&SIDAuthWorld,
1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pSIDEveryone);
我还获得了文件安全描述符和ACL的副本:
dwRes = GetNamedSecurityInfo(
lpszOwnFile,
SE_FILE_OBJECT,
DACL_SECURITY_INFORMATION,
NULL,
NULL,
&pACL,
NULL,
&pSecDesc);
现在我有两个选择:
-
我可以手动从ACL获取每个ACE并验证它对 Everyone 组的访问掩码 .
-
我可以使用 AccessCheck 方法检查模拟令牌是否可以访问给定操作的文件 .
我想避免实现1.选项,因为它需要大量的检查(不同类型的ACE,匹配访问掩码等)我想简单地调用 AccessCheck 方法,但是这种方法需要处理模拟令牌作为输入参数 . 问题是(正如我在网上找到的)我不能仅基于组SID创建模拟令牌,我还需要用户SID .
我想象Everyone组有权访问文件但是这个特定用户(来自模拟令牌)没有访问权限 . 在这种情况下 AccessCheck 将返回错误的判决 .
我的问题;
-
是否有任何选项仅基于组SID创建模拟令牌?
-
我可以使用某种默认用户SID,我可以将其用于模拟令牌,而不会扭曲结果吗?
-
还有其他方法可以检查特定组是否对某个文件有某种访问权限吗?
-
手动ACE是否选中执行此操作的唯一选项?