#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.