检查Windows对象中是否存在ACE DACL

问题描述:

有没有办法检查对象的DACL中是否已经存在ACE检查Windows对象中是否存在ACE DACL

我想使用RtlAddAccessAllowedAce API调用将一个ACE添加到对象,但我想这样做只有当ACE已不存在。

有人知道我该如何检查ACE是否已经存在,或者试图在添加之前删除给定的ACE,或者其他能够实现相同目标的解决方案吗?谢谢!

可以或ACL的ACE使用WINAPI或直接走 - 一个和检查枚举ACE一个是一些具体的ACE存在:

变体1:

void WalkAcl(PACL acl) 
{ 
    ACL_SIZE_INFORMATION asi; 
    if (GetAclInformation(acl, &asi, sizeof(asi), AclSizeInformation)) 
    { 
     if (asi.AceCount) 
     { 
      do 
      { 
       union { 
        PVOID pvAce; 
        PACE_HEADER pAceHeader; 
        PACCESS_ALLOWED_ACE pAllowedAce; 
       }; 

       PWSTR szSid; 
       if (GetAce(acl, --asi.AceCount, &pvAce)) 
       { 
        switch (pAceHeader->AceType) 
        { 
        case ACCESS_ALLOWED_ACE_TYPE: 
         if (ConvertSidToStringSid(&pAllowedAce->SidStart, &szSid)) 
         { 
          DbgPrint("%08x %S\n", pAllowedAce->Mask, szSid); 
          LocalFree(szSid); 
         } 
         break; 
        } 
       } 

      } while (asi.AceCount); 
     } 
    } 
} 

变种2:

void WalkAcl(PACL acl) 
{ 
    if (USHORT AceCount = acl->AceCount) 
    { 
     union { 
      PVOID pv; 
      PBYTE pb; 
      PACE_HEADER pAceHeader; 
      PACCESS_ALLOWED_ACE pAllowedAce; 
     }; 

     pv = acl + 1; 

     do 
     { 
      UNICODE_STRING usSid; 
      switch (pAceHeader->AceType) 
      { 
      case ACCESS_ALLOWED_ACE_TYPE: 
       if (0 <= RtlConvertSidToUnicodeString(&usSid, &pAllowedAce->SidStart, TRUE)) 
       { 
        DbgPrint("%08x %wZ\n", pAllowedAce->Mask, usSid); 
        RtlFreeUnicodeString(&usSid); 
       } 
       break; 
      } 

     } while (pb += pAceHeader->AceSize, --AceCount); 
    } 
} 
+0

评论是不适合扩展讨论;这个对话已经[转移到聊天](http://chat.*.com/rooms/154136/discussion-on-answer-by-rbmm-checking-the-existence-of-ace-in-windows-object- DAC)。 – Andy