Железобетонные объекты Фленов Михаил 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; |