Железобетонные объекты: DACL Фленов Михаил aka Horrific Хакер, номер #093, стр. 093-128-2 Итак, чтобы получить DACL мы должны написать следующую строку кода: GetNamedSecurityInfo(PChar(Edit1.Text), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSD) При этом переменные pSD и pDACL должны быть объявлены следующим образом: pSD : PSECURITY_DESCRIPTOR; pDACL : PACL; Получение информации Структуру типа ACL мы получили, но это еще не сама информация. Сам список доступа можно получить с помощью функции GetAclInformation, которая описана следующим образом: function GetAclInformation( const pAcl: TACL; pAclInformation: Pointer; nAclInformationLength: DWORD; dwAclInformationClass: TaclInformationClass ): BOOL; stdcall; Посмотрим на параметры этой функции: pAcl – указатель на структуру типа TACL, которую мы получили при вызове функции GetNamedSecurityInfo; pAclInformation – указатель, по которому мы получим результирующую информацию; nAclInformationLength – размер параметра, указанного в pAclInformation; dwAclInformationClass – класс необходимой информации. Нас интересует класс AclSizeInformation. Самое интересное – это второй параметр, через который мы получаем необходимые данные. В функции этот параметр объявлен как простой указатель, но он должен указывать на структуру типа ACL_SIZE_INFORMATION. Я не нашел ее описания в заголовочных файлах Delphi, поэтому благодаря файлу помощи пришел к выводу, что она должна выглядеть следующим образом: ACL_SIZE_INFORMATION = record AceCount :DWORD; AclBytesInUse :DWORD; AclBytesFree : DWORD; end; Итак, получить информацию можно, выполнив следующую строку: GetAclInformation(pDACL^, @aclInfo, sizeOf(aclInfo), AclSizeInformation) Первую переменную мы уже объявили, а aclInfo нужно объявить как: aclInfo : ACL_SIZE_INFORMATION; Просматриваем список DACL У нас есть список, и теперь осталось только его просмотреть и определить права доступа. И тут у дельфинистов начинаются проблемы. Список DACL состоит из набора структур ACE и идентификаторов SID. Проблема в том, что структура ACE в Delphi нигде не описана. Если обратиться к файлу помощи по Windows API, то тут описания этой структуры нет. Зато написано, что ACE - это запись в списке контроля доступа. Существует несколько типов этих записей и в файле помощи перечислено всего четыре. Забегая вперед скажу, что реально их намнооооого больше. Другое дело, что не все они поддерживаются, да и нужны нам только два типа – разрешение и запрещение (ACCESS_ALLOWED_ACE и ACCESS_DENIED_ACE). Но как они выглядят? Читаем файл помощи дальше и видим, что в начале структуры ACE идет структура ACE_HEADER, а после этого количество и типы параметров зависят от типа ACE. Структуры ACE_HEADER в заголовочных файлах я так же не нашел, но благодаря Help файлу можно определить, что в Delphi она должна выглядеть примерно так: _ACE_HEADER = record AceType : BYTE; AceFlags : BYTE; AceSize : WORD; end; Понятно, что назвать ее можно как угодно и поля тоже можно назвать как душа пожелает, главное, чтобы количество и типы параметров были именно такими. Первый параметр структуры – это тип записи. Типов бывает великое множество и их описание можно найти в MSDN, но большинство из них не поддерживается, а нас будет интересовать только ACCESS_ALLOWED_ACE и ACCESS_DENIED_ACE_TYPE. |