Изменение списков управления доступом объекта в C++
В следующем примере в список управления доступом (DACL) объекта добавляется запись управления доступом (ACE).
Параметр AccessMode определяет тип нового ACE и способ объединения нового ACE с любыми существующими ACE для указанного доверенного лица. Используйте флаги GRANT_ACCESS, SET_ACCESS, DENY_ACCESS или REVOKE_ACCESS в параметре AccessMode . Сведения об этих флагах см. в разделе ACCESS_MODE.
Аналогичный код можно использовать для работы со списком управления доступом системы (SACL). Укажите SACL_SECURITY_INFORMATION в функциях GetNamedSecurityInfo и SetNamedSecurityInfo , чтобы получить и задать saCL для объекта . Используйте флаги SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE и REVOKE_ACCESS в параметре AccessMode . Сведения об этих флагах см. в разделе ACCESS_MODE.
Используйте этот код для добавления ACE для конкретного объекта в DACL объекта службы каталогов. Чтобы указать идентификаторы GUID в ACE для конкретного объекта, задайте для параметра TrusteeForm значение TRUSTEE_IS_OBJECTS_AND_NAME или TRUSTEE_IS_OBJECTS_AND_SID, а параметр pszTrustee — в качестве указателя на структуру OBJECTS_AND_NAME или OBJECTS_AND_SID .
В этом примере используется функция GetNamedSecurityInfo для получения существующего списка DACL. Затем он заполняет структуру EXPLICIT_ACCESS сведениями об ACE и использует функцию SetEntriesInAcl для слияния нового ACE с любыми существующими ACE в DACL. Наконец, в примере вызывается функция SetNamedSecurityInfo для присоединения нового СПИСКА DACL к дескриптору безопасности объекта .
#include <windows.h>
#include <stdio.h>
DWORD AddAceToObjectsSecurityDescriptor (
LPTSTR pszObjName, // name of object
SE_OBJECT_TYPE ObjectType, // type of object
LPTSTR pszTrustee, // trustee for new ACE
TRUSTEE_FORM TrusteeForm, // format of trustee structure
DWORD dwAccessRights, // access mask for new ACE
ACCESS_MODE AccessMode, // type of ACE
DWORD dwInheritance // inheritance flags for new ACE
)
{
DWORD dwRes = 0;
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
if (NULL == pszObjName)
return ERROR_INVALID_PARAMETER;
// Get a pointer to the existing DACL.
dwRes = GetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) {
printf( "GetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
// Initialize an EXPLICIT_ACCESS structure for the new ACE.
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = AccessMode;
ea.grfInheritance= dwInheritance;
ea.Trustee.TrusteeForm = TrusteeForm;
ea.Trustee.ptstrName = pszTrustee;
// Create a new ACL that merges the new ACE
// into the existing DACL.
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetEntriesInAcl Error %u\n", dwRes );
goto Cleanup;
}
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);
return dwRes;
}