Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Железобетонные объекты: DACL

Фленов Михаил aka Horrific

Хакер, номер #093, стр. 093-128-4


sid := PSID(@((ace)^.SidStart));

Теперь, по идентификатору необходимо узнать имя пользователя и домен, в котором он зарегистрирован. Для этого используем функцию LookupAccountSid, которая выглядит так:

function LookupAccountSid(

lpSystemName: PChar;

Sid: PSID;

Name: PChar;

var cbName: DWORD;

ReferencedDomainName: PChar;

var cbReferencedDomainName: DWORD;

var peUse: SID_NAME_USE

): BOOL; stdcall;

Быстренько пробежимся по параметрам этой функции:

lpSystemName – указатель на строку для системного имени. Мы будем определять пользователя по SID, поэтому этот параметр должен быть нулевой;

Sid – идентификатор интересующего нас пользователя

Name – указатель на строку, куда будет записано имя пользователя;

cbName – размер строки для имени пользователя;

ReferencedDomainName – строка для имени домена;

cbReferencedDomainName – размер строки с именем домена;

peUse – структура, определяющая тип записи.

Пример использования функции:

var

user, domain : array [0..200] of char;

len: DWORD;

begin

...

LookupAccountSid(nil, sid, user, len, domain, len, sid_nu);

...

end;

В кучу!

Теперь соберем все вышесказанное в кучу и напишем полноценный пример. Для этого на форме нам понадобится: поле для ввода имени файла, кнопочка и список ListView из четырех колонок:

- имя пользователя;

- домен;

- доступ (тип ACE записи);

- действия (разрешаемые или запрещаемые).

По нажатию кнопки нужно написать код из листинга 1. Для понимания этого кода даже комментарии не нужны, потому что все функции и действия мы уже подробно рассмотрели. Не забудь добавить в проект описания структур и переменных, которые мы рассматривали в этой статье.

Заключение

Для компиляции примера желательно подключить заголовочные файлы AclApi, AccCtrl и Windows, где описаны все необходимые для работы с ACL функции и структуры. Хочу сделать одно замечание – в данной статье я просто рассматривал функции и примеры их вызова без проверок на ошибки. В примере, который ты найдешь на компакт диски, все проверяется на ошибки, потому что они могут быть. Если юзер выберет файл, находящийся на FAT32, то произойдет ошибка, ведь эта ФС не поддерживает списки доступа.

Удачного кодинга! В ближайшее время мы продолжим тему прав доступа, потому что тут еще много интересного.

Листинг

aclListView.Items.Clear;

if (GetNamedSecurityInfo(PChar(Edit1.Text), SE_FILE_OBJECT,

DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil,

pSD)<>ERROR_SUCCESS) then

begin

ShowMessage('Ошибка');

exit;

end;

if (pDACL=nil) then

begin

ShowMessage('Список доступа пуст');

exit;

end;

if (not GetAclInformation(pDACL^, @aclInfo, sizeOf(aclInfo),

AclSizeInformation)) then

begin

ShowMessage('Не получилось определить информацию об ACL');

exit;

end;

for i:=0 to aclInfo.AceCount-1 do

begin

if not (GetAce(pDACL^, i, Pointer(ace))) then

continue;

newAcl:=aclListView.Items.Add;

sid := PSID(@((ace)^.SidStart));

len := 200;

if (LookupAccountSid(nil, sid, user, len,

Назад на стр. 093-128-3  Содержание  Вперед на стр. 093-128-5