2017-09-10 6 views
1

Gibt es eine Möglichkeit zu überprüfen, ob ein ACE bereits in der eines Objekts existiert?Überprüfen der Existenz von ACE in Windows-Objekt DACL

Ich möchte den RtlAddAccessAllowedAce API Aufruf verwenden, um ein ACE zu einem Objekt hinzuzufügen, aber ich möchte das nur tun, wenn die ACE nicht bereits existiert.

Weiß jemand, wie ich entweder überprüfen kann, ob die ACE bereits existiert, oder zu versuchen, die gegebenen ACE vor dem Hinzufügen zu entfernen, oder eine andere Lösung, die das gleiche Ziel erreichen wird? Vielen Dank!

Antwort

2

Sie oder winapi oder direkt zu Fuß von ACL ACEs verwenden können - aufzählen ACE eins nach dem anderen und die Prüfung sind einige spezifische ACE existieren:

Variante 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); 
     } 
    } 
} 

Variante 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

Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/154136/discussion-on-answer-by-rbmm-checking-the-existence-of-ace-in-windows-object- dac). – Andy

Verwandte Themen