Железобетонные объекты Фленов Михаил aka Horrific Хакер, номер #092, стр. 092-113-2 Sbz1 – этот параметр не используется и должен быть равен нулю (предназначен только для выравнивания). Control – это поле имеет тип данных Word и содержит флаги. Owner – идентификатор безопасности SID владельца. Group – идентификатор безопасности SID группы. SAcl – указатель на SACL; DAcl – указатель на DACL; Работа с дескриптором Несмотря на то, что дескриптор безопасности легко описать в виде структуры, работать с ним напрямую не рекомендуется. Наверное, поэтому его не описывают в файле справки. Почему нежелателен прямой доступ к полям? Дело в том, что дескриптор может хранить данные непосредственно, а может просто содержать указатель на данные. Вместо прямого доступа необходимо использовать специализированные функции. Этих функций предостаточно, но мы остановимся на трех из них: инициализация, установка владельца объекта и установка группы. Да, данной структуре необходима инициализация, ведь она может хранить указатели на данные, а любой указатель требует выделения памяти. Для инициализации дескриптора безопасности используем WinAPI-функцию initializeSecurityDescriptor, которая выглядит следующим образом: КОД function InitializeSecurityDescriptor( pSecurityDescriptor: PSecurityDescriptor; dwRevision: DWORD ): BOOL; stdcall; Тут у нас два параметра: указатель на дескриптор безопасности, который нужно инициализировать и номер ревизии. Как мы уже выяснили, ревизия должна быть равна константе SECURITY_DESCRIPTOR_REVISION. Чтобы установить владельца, используется функция SetSecurityDescriptorOwner, которая выглядит следующим образом: КОД function SetSecurityDescriptorOwner( pSecurityDescriptor: PSecurityDescriptor; pOwner: PSID; bOwnerDefaulted: BOOL ): BOOL; stdcall; Тут три параметра: - дескриптор, владельца объекта которого нужно изменить; - указатель на SID пользователя, которого мы хотим установить в качестве владельца; - нужно ли использовать владельца по умолчанию. Если этот параметр равен true, то владельца назначит ОС в соответствии со своими правилами. А правило простое: создатель становится и владельцем. Для установки группы используем функцию SetSecurityDescriptorGroup, которая выглядит так: КОД function SetSecurityDescriptorGroup( pSecurityDescriptor: PSecurityDescriptor; pGroup: PSID; bGroupDefaulted: BOOL ): BOOL; stdcall; Функция очень похожа на установку владельца. Тут у нас опять три параметра, которые имеют схожее с функцией SetSecurityDescriptorOwner назначение: - дескриптор, группу объекта которого нужно изменить; - указатель на SID группы, которую мы хотим установить в качестве владельца; - нужно ли использовать группу по умолчанию, то есть понадеяться на ОС. SID Списки доступа SACL и DACL пока опустим и не будем с ними заморачиваться, так как это тема отдельной статьи. Сейчас нас интересуют владелец и группа, но, чтобы их установить, необходимо знать соответствующий SID. Да, мы всегда можем использовать значение по умолчанию, которое предоставляет ОС, но определить SID не так уж и сложно. Для этого нужна всего одна функция – LookupAccountName, которая по имени пользователя возвращает идентификатор безопасности SID. |