Не удалось использовать AddAccessAllowedAce для добавления ACE к существующему списку управления доступом

#windows #security #acl

#Windows #Безопасность #acl

Вопрос:

Я использую следующий код для получения списка управления доступом с SD:

 ...
PACL pDacl = NULL;
BOOL bDaclPresent = TRUE;
BOOL bDaclDefaulted = FALSE;
if(!GetSecurityDescriptorDacl((PSECURITY_DESCRIPTOR)spSecurityDescriptor.get(),
                                amp;bDaclPresent,
                                amp;pDacl,
                                amp;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(v=vs.85).aspx Но речь идет о создании совершенно нового списка управления доступом, не в том же случае.

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

Есть идеи?

Комментарии:

1. вопрос решен. Я могу использовать следующий способ, чтобы получить ‘nAceListLength’ ((PACE_HEADER)(тЕмп))->AceSized

2. Класс справки по безопасности ATL может избежать подобных ошибок.

Ответ №1:

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 есть статья.

Комментарии:

1. Ссылка особенно полезна, поскольку содержит подробную информацию о таких вещах, как помещение нового Ace перед унаследованным Ace.