我想检查文件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是否选中执行此操作的唯一选项?