代码之家  ›  专栏  ›  技术社区  ›  DougN

从setnamedsecurityinfo继承acl时出错?

  •  0
  • DougN  · 技术社区  · 17 年前

    什么? ERROR_BAD_INHERITANCE_ACL 从setnamedsecurityinfo返回暗示?在本例中,我将用户添加到目录的acl。我已经查看了相关的目录,在调用之前,它的权限似乎是合理的。但电话没打通。

    有什么想法吗?

    这是做这项工作的代码片段(当我粘贴到这里时,我想知道 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); 
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   user229044    15 年前

    代码示例肯定会有帮助。很容易得到构建和设置acl的逻辑,这是一个微妙的错误。

    我面前没有代码,但基本逻辑是:

    1. 获取具有足够访问掩码的进程令牌
    2. GetnamedSecurity信息
    3. 为新的ace分配一个足够大的新acl,从旧的复制到新的,并调用addaccessallowedaceex来添加用户的sid
    4. setnamedsecurityinfo设置