windows - Kunne ikke bruge AddAccessAllowedAce til at tilføje en ACE til en eksisterende ACL

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger følgende kode for at få en ACL fra SD:


...
PACL pDacl = NULL;
BOOL bDaclPresent = TRUE;
BOOL bDaclDefaulted = FALSE;
if(!GetSecurityDescriptorDacl((PSECURITY\_DESCRIPTOR)spSecurityDescriptor.get(),
                                &bDaclPresent,
                                &pDacl,
                                &bDaclDefaulted))
{
    ReportError(TEXT("Failed to call GetSecurityDescriptorDacl."));
    ...
}


Så bruger jeg AddAccessAllowedAce til at tilføje en ny ACE:


if(!AddAccessAllowedAce(pDacl,
                        ACL\_REVISION,
                        MQSEC\_QUEUE\_GENERIC\_ALL,
                        pAnnySid))
{
    dwErrCode = GetLastError();
    ReportError(dwErrCode);
    ReportError(TEXT("Failed to call AddAccessAllowedAce."));
    ...
}


Jeg fik en fejl 1344, at 'Der er ikke mere hukommelse tilgængelig til sikkerhedsopdateringer.'


Så forsøgte jeg at øge størrelsen af ​​PACL buffer og ændrede PACL header informationen.
Men jeg fik stadig en fejl 1336 'ACL-strukturen (Access Control List) er ugyldig.'


Kan nogen give mig en arbejdsprøvekode for at gøre dette?


MSDN aktiverede en prøve af AddAccessAllowedAce her:
http://msdn.microsoft.com/en-us/library/ms707085\%28v=vs.85\%29.aspx
Men det er ved at oprette en helt ny ACL, ikke den samme sag. [4]


Jeg synes endda at 'GetAce' fra gammel ACL og derefter 'AddAce' til en ny ACL, til sidst tilføjer jeg min egen nye ACE.
Men ser ud som 'AddAce' har brug for en parameter 'nAceListLength'; og jeg ved ikke hvordan man får denne værdi fra ACE.


Nogle ideer?

Bedste reference


GetSecurityDescriptorDacl () giver dig bare en pointer til DACL, der allerede er til stede i SECURITY\_DESCRIPTOR buffer. Hvis du vil tilføje noget til det, skal du allokere en større buffer, kopiere den eksisterende DACL og derefter tilføje den nye ACE. Du skal gøre noget som følger (pseudo-kode fra toppen af ​​mit hoved, kan have fejl):


PACL pOldDacl = GetSecurityDescriptorDacl(pSecurityDescriptor);
DWORD cbOldSize = GetAclInformation(pOldDacl, ACL\_SIZE\_INFORMATION);
DWORD cbNewSize = cbOldSize + sizeof(ACE that you want to add);
PACL pNewDacl = alloc(cbNewSize);
InitializeAcl(pNewDacl, cbNewSize);
for each pAce in pOldDacl // GetAce(pOldDacl)
    AddAce(pNewDacl, pAce);
AddAce(pNewDacl, the ACE that you want to add); // or use specialized functions like AddAccessAllowedAce, etc
SetSecurityDescriptorDacl(pSecurityDescriptor, pNewDacl);


Microsoft KB har en artikel. [5]