Не удалось использовать AddAccessAllowedAce для добавления ACE к существующему ACL - PullRequest
0 голосов
/ 14 апреля 2011

Я использую следующий код для получения ACL от 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."));
    ...
}

Затем я использую 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/en-us/library/ms707085%28v=vs.85%29.aspx Но он собирается создать совершенно новый ACL, а не тот же случай.

Я даже думаю «GetAce» из старого ACL, затем «AddAce» в новый ACL, в конце я добавляю свой новый ACE. Но похоже, что для 'AddAce' нужен параметр 'nAceListLength'; и я не знаю, как получить это значение из ACE.

Есть идеи?

1 Ответ

1 голос
/ 14 апреля 2011

GetSecurityDescriptorDacl () просто дает вам указатель на DACL, который уже присутствует в буфере SECURITY_DESCRIPTOR.Если вы хотите что-то добавить к нему, вам нужно выделить больший буфер, скопировать существующий 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 есть статья .

...