无法使用AddAccessAllowedAce将ACE附加到现有ACL

| 我使用以下代码从SD获取ACL:
...
PACL pDacl = NULL;
BOOL bDaclPresent = TRUE;
BOOL bDaclDefaulted = FALSE;
if(!GetSecurityDescriptorDacl((PSECURITY_DESCRIPTOR)spSecurityDescriptor.get(),
                                &bDaclPresent,
                                &pDacl,
                                &bDaclDefaulted))
{
    ReportError(TEXT(\"Failed to call GetSecurityDescriptorDacl.\"));
    ...
}
然后,我使用AddAccessAllowedAce附加一个新的ACE:
if(!AddAccessAllowedAce(pDacl,
                        ACL_REVISION,
                        MQSEC_QUEUE_GENERIC_ALL,
                        pAnnySid))
{
    dwErrCode = GetLastError();
    ReportError(dwErrCode);
    ReportError(TEXT(\"Failed to call AddAccessAllowedAce.\"));
    ...
}
我收到一个错误1344,“没有更多内存可用于安全信息更新。” 然后,我尝试增加PACL缓冲区的大小并更改了PACL标头信息。 但是我仍然收到错误1336 \“访问控制列表(ACL)结构无效。\” 谁能给我一个有效的示例代码来做到这一点? MSDN在这里私有了AddAccessAllowedAce的示例: http://msdn.microsoft.com/zh-cn/library/ms707085%28v=vs.85%29.aspx 但这将要创建一个全新的ACL,而不是相同的情况。 我什至认为从旧ACL到\'GetAce \',然后是\'AddAce \'到新ACL,最后我附加了自己的新ACE。 但是看起来“ AddAce”需要一个参数“ nAceListLength”;而且我不知道如何从ACE获得此值。 有任何想法吗?     
已邀请:
GetSecurityDescriptorDacl()仅向您提供指向SECURITY_DESCRIPTOR缓冲区中已经存在的DACL的指针。如果要向其中添加某些内容,则需要分配更大的缓冲区,复制现有的DACL,然后添加新的ACE。您需要执行以下操作(伪代码不在我的头上;可能有错误):
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有一篇文章。     

要回复问题请先登录注册