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