2009-05-29 4 views
0

Que signifie ERROR_BAD_INHERITANCE_ACL renvoyé par SetNamedSecurityInfo? Dans ce cas, j'ajoute un utilisateur à la liste de contrôle d'accès d'un répertoire. J'ai regardé le répertoire en question et ses droits semblent raisonnables avant l'appel. Mais les appels échouent.ERROR_BAD_INHERITANCE_ACL à partir de SetNamedSecurityInfo?

Des pensées?

Voici l'extrait de code fait le travail (et comme je le coller ici, je me demande sur la valeur NO_MULTIPLE_TRUSTEE):

pAAP is a pointer to a structure with the following members: 
CString objName;   // name of object 
SE_OBJECT_TYPE ObjectType; // type of object 
CString trustee;   // trustee for new ACE (explicit user name) 
CString targetComputer; 
bool bNeedWrite; 

    DWORD dwRes = 0; 
    PACL pOldDACL = NULL, pNewDACL = NULL; 
    PSECURITY_DESCRIPTOR pSD = NULL; 
    EXPLICIT_ACCESS ea = {0}; 
    CSID trusteeSID; 

    bool bGotSID = false; 
    if(0 == wcsncmp(pAAP->trustee, L"SID:", 4)) //4 = len of SID: //GLOK 
     bGotSID = CSID::FromString((LPWSTR)((LPCWSTR)pAAP->trustee + 4), trusteeSID); 
    else 
     bGotSID = CSID::FromAccount(pAAP->targetComputer, pAAP->trustee, trusteeSID); 

    if(false == bGotSID) 
    { 
     Log(logDEBUG, L"CSID::FromAccount failed for [%s] on [%s]. GLE=%s", pAAP->trustee, pAAP->targetComputer, GetSystemErrorMessage(GetLastError())); 
     _ASSERT(0); 
     goto Cleanup; 
    } 

    // Get a pointer to the existing DACL. 
    dwRes = GetNamedSecurityInfo(pAAP->objName.LockBuffer(), pAAP->ObjectType, DACL_SECURITY_INFORMATION, 
           NULL, NULL, &pOldDACL, NULL, &pSD); 
    pAAP->objName.UnlockBuffer(); 
    if (ERROR_SUCCESS != dwRes) 
    { 
     Log(logDEBUG, L"GetNamedSecurityInfo failed on [%s] for [%s] on [%s]. GLE=%s", pAAP->objName, pAAP->trustee, pAAP->targetComputer, GetSystemErrorMessage(dwRes)); 
     //_ASSERT(ERROR_FILE_NOT_FOUND == dwRes); 
     goto Cleanup; 
    } 

    // Initialize an EXPLICIT_ACCESS structure for the new ACE. 
    ea.grfAccessPermissions = pAAP->bNeedWrite ? GENERIC_ALL : GENERIC_READ; 
    ea.grfAccessMode = GRANT_ACCESS; 
    ea.grfInheritance= CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE; 
    ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
    ea.Trustee.TrusteeType = TRUSTEE_IS_USER; 
    ea.Trustee.ptstrName = (LPWSTR)(PSID)trusteeSID; 
    ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; 

    // Create a new ACL that merges the new ACE into the existing DACL. 
    dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL); 
    if (ERROR_SUCCESS != dwRes) 
    { 
     Log(logDEBUG, L"SetEntriesInAcl failed on [%s] for [%s] on [%s]. GLE=%s", pAAP->objName, pAAP->trustee, pAAP->targetComputer, GetSystemErrorMessage(dwRes)); 
     //_ASSERT(0); 
     goto Cleanup; 
    } 

    // Attach the new ACL as the object's DACL. 
    dwRes = SetNamedSecurityInfo(pAAP->objName.LockBuffer(), pAAP->ObjectType, DACL_SECURITY_INFORMATION, 
           NULL, NULL, pNewDACL, NULL); 
    if (ERROR_SUCCESS != dwRes) 
    { 
     Log(logDEBUG, L"SetNamedSecurityInfo failed on [%s] for [%s] on [%s]. GLE=%s", pAAP->objName, pAAP->trustee, pAAP->targetComputer, GetSystemErrorMessage(dwRes)); 
     //_ASSERT(dwRes == ERROR_BAD_INHERITANCE_ACL); 
     goto Cleanup; 
    } 

Cleanup: 
    if(pSD != NULL) 
     LocalFree((HLOCAL) pSD); 
    if(pNewDACL != NULL) 
     LocalFree((HLOCAL) pNewDACL); 
+0

de l'utilisateur Si t Le répertoire a des sous-répertoires, je vérifie aussi leurs paramètres de sécurité. –

+0

Pourquoi? AFAIK aucune des API de sécurité n'applique récursivement les paramètres de sécurité. Ils configurent les ACL de sorte que les objets nouvellement créés héritent des ACL héritables de leur parent. Mais lorsque vous cliquez sur "Appliquer ces paramètres récursivement" dans la boîte de dialogue des propriétés de sécurité, c'est la boîte de dialogue du shell, et non l'API de sécurité, qui effectue la récursivité. –

+0

J'ai lu une page Web qui suggérait cela comme une cause possible. J'aurais aimé inclure la page web en tant que lien car je ne trouve pas la page maintenant. J'ai trouvé quelques autres causes possibles ici: http://www.microsoft.com/technet/support/ee/transform.aspx?ProdName=Windows+Operating+System&ProdVer=5.0&EvtID=1340&EvtSrc=Security et ici: http: // support.microsoft.com/kb/155012 –

Répondre

0

Un exemple de code serait certainement aider. Il est facile d'obtenir une logique de construction et de paramétrer l'ACL de manière subtile.

Je n'ai pas le code devant moi, mais la logique de base est:

  1. acquérir le jeton de processus avec un masque d'un accès suffisant
  2. GetNamedSecurityInfo
  3. allouer une nouvelle ACL assez grande pour le nouveau ACE, copier de l'ancien au nouveau, et appeler AddAccessAllowedAceEx ajouter SID
  4. SetNamedSecurityInfo
Questions connexes