Железобетонные объекты: DACL Фленов Михаил aka Horrific Хакер, номер #093, стр. 093-128-3 Загадочный ACE С заголовком определились, но что же будет идти после заголовка в записи ACE? Опять приходиться обращаться к MSDN, где мы узнаем, что для записей разрешения и запрещения доступа после заголовка идет два значения: маска доступа типа ACCESS_MASK и число типа DWORD, которое идентификатор SID пользователя или группы, в отношении которого это разрешение действует. Так как разрешающая и запрещающая запись ACE выглядят одинаково, то мы можем объявить одну структуру следующего вида: ACCESS_ACE = record Header : _ACE_HEADER; Mask : ACCESS_MASK; SidStart : DWORD; end; Просмотр списка Итак, в переменной aclInfo у нас есть информация о записях ACL. Теперь нужно просто просмотреть его и вывести информацию на экран. Для этого цикл должен выглядеть примерно следующим образом: for i:=0 to aclInfo.AceCount-1 do begin if not (GetAce(pDACL^, i, Pointer(ace))) then continue; // Разбор записи ACE end; Список ACL содержит только указатели на ACE записи. Напоминаю, что ACL – это список контроля доступа, а ACE – это отдельная запись этого списка. Чтобы получить запись из списка контроля доступа нужно использовать функцию GetAce. Ей передается три параметра: - указатель на ACL; - индекс интересующей нас записи; - указатель на переменную, в которую будет записан результат. Если результат не нулевой, значит процесс получения записи прошел удачно. В примере выше, в качестве третьего параметра передается указатель переменной ace. Ее нужно объявить следующим образом: ace : ^ACCESS_ACE; То есть, это указатель на структуру ACCESS_ACE, формат которой мы так тщательно вычисляли благодаря файлу помощи и MSDN. Разбор записи ACE Просматривая список, мы получили ACE запись и по ней теперь должны определить, что разрешено, а что запрещено. Но одна запись может быть либо разрешающая, либо запрещающая. Нет такой записи, которая описывала и то и другое сразу. Если нужно что-то запретить, а что-то разрешить, то в списке ACL создается две записи ACE. Одна запись что-то разрешает, а другая что-то запрещает. Чтобы определить, какая именно перед нами запись, необходимо проверить поле AceType заголовка ACE записи: case (ace^.Header.AceType) of ACCESS_ALLOWED_ACE_TYPE: Это разрешение; ACCESS_DENIED_ACE_TYPE: Это запрещение; else Что-то другое; end; Константы ACCESS_ALLOWED_ACE_TYPE и ACCESS_DENIED_ACE_TYPE опять же в заголовочных файлах Delphi я не нашел, поэтому их придется описать в проекте самостоятельно следующим образом: ACCESS_ALLOWED_ACE_TYPE = $00; ACCESS_DENIED_ACE_TYPE = $01; Теперь, если это разрешение или запрещение, нужно узнать, что именно разрешается. Об этом можно узнать из параметра mask. Полное описание маски можно найти в MSDN, а основные биты – первые три: 1. Чтение. 2. Запись. 3. Выполнение. А на какого пользователя или группу влияют данные разрешения? Об этом можно узнать по полю SidStart структуры ACE. Но это всего лишь указатель на идентификатор пользователя/группы. Реальное значение можно определить следующей строкой кода: |