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

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

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

Хакер, номер #092, стр. 092-113-4


Пример

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

Данный пример создает файл, а, чтобы создать файл с использованием дескриптора безопасности, можно заменить последнюю строку с вызовом функции CreateFile на:

CreateDirectory('c:\Directoryname', @securityAttributes);

Итого

Тема безопасности Windows и работы с ее списками и идентификаторами очень интересная, и, возможно, мы еще вернемся к этой теме в ближайшее время и расскажем тебе что-то новое. На этом могу только откланяться. Удачного кодинга!

Создание объектов с явным заданием владельца и группы

procedure TForm1.Button1Click(Sender: TObject);

var

securityAttributes: TSecurityAttributes;

securityDescriptor: TSecurityDescriptor;

sidLength, sidLengthDomain: Cardinal;

sidType: SID_NAME_USE;

sidValue: PSID;

domain:PChar;

begin

// Обнуляем длину буферов, чтобы определить корректный размер

sidLength := 0;

sidLengthDomain := 0;

// Первый вызов завершиться ошибкой, но вернет размер данных

LookupAccountName(nil, 'flenov', nil, sidLength, nil, sidLengthDomain, sidType);

// Выделяем память для идентификатора имени и домена

sidValue := AllocMem(sidLength);

domain := AllocMem(sidLengthDomain);

// На этот раз мы определим SID

if (LookupAccountName(nil, 'flenov', sidValue, sidLength, domain, sidLengthDomain, sidType)=false) then

exit;

// Инициализация дескриптора

InitializeSecurityDescriptor(@securityDescriptor, SECURITY_DESCRIPTOR_REVISION);

// Устанавливаем полученный SID владельцу и группе

SetSecurityDescriptorOwner(@securityDescriptor, sidValue, false);

SetSecurityDescriptorGroup(@securityDescriptor, nil, true);

securityAttributes.nLength := sizeof(securityAttributes);

securityAttributes.lpSecurityDescriptor := @securityDescriptor;

securityAttributes.bInheritHandle:=false;

// Создаем файл на основе своего дескриптора безопасности

CreateFile('e:\test.txt', GENERIC_ALL, 0, @securityAttributes,

CREATE_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, 0);

end;

Назад на стр. 092-113-3  Содержание