Железобетонные объекты Фленов Михаил aka Horrific Хакер, номер #092, стр. 092-113-3 В общем виде функция выглядит следующим образом: КОД function LookupAccountName( lpSystemName, lpAccountName: PChar; Sid: PSID; var cbSid: DWORD; ReferencedDomainName: PChar; var cbReferencedDomainName: DWORD; var peUse: SID_NAME_USE ): BOOL; stdcall; Давай рассмотрим параметры этой функции: lpSystemName – имя системы. Если этот параметр нулевой, то мы ищем локального пользователя, если нужен SID удаленного пользователя, то необходимо указать здесь имя этой машины; lpAccountName – имя пользователя, идентификатор которого нам нужен; Sid – указатель на память, куда будет записан результат; cbSid – длина буфера, которую мы выделили для параметра Sid, то есть для хранения результирующего идентификатора; ReferencedDomainName – имя домена; cbReferencedDomainName – длина буфера ReferencedDomainName; peUse – переменная типа enum, которая определяет тип учетной записи. Здесь может быть одно из следующих значений: - SidTypeUser – пользовательский SID; - SidTypeGroup – SID группы; - SidTypeDomain - SID доменной учетной записи; - SidTypeAlias – псевдоним; - SidTypeDeletedAccount - удаленная учетная запись; - SidTypeInvalid – некорректный тип; - SidTypeUnknown – тип неизвестен; - SidTypeComputer – идентификатор компьютера. Что такое SID? Что такое SID хорошо иллюстрирует заголовочный файл windows.pas. Запускаем поиск по трем магическим буквам (нет, не по тем буквам, которые пишутся на заборе, а по SID) и натыкаемся на табличку, которую ты можешь увидеть где-то рядом с этим текстом. Нетрудно догадаться, что на самом деле SID - это структура, которая состоит из: SubAuthorityCount – количество записей SubAuthority; Revision – версия, в ней используются только четыре бита, остальные зарезервированы; IdentifierAuthority – структура, которая хранит идентификатор SID; SubAuthority – массив относительных идентификаторов; Структура IdentifierAuthority имеет следующий вид: _SID_IDENTIFIER_AUTHORITY = record Value: array[0..5] of Byte; end; Банальный массив из пяти байт. Прямая работа с SID нежелательна. Для манипулирования этой структурой в WinAPI есть все необходимые функции — лучше использовать их. Но это уже отдельная история, а я итак уже не укладываюсь во временные и объемные рамки. Определение SID Обрати внимание, что функции LookupAccountName, которую мы только что рассмотрели, необходимо передать указатель на память для хранения идентификатора SID и указать размер. Проблема в том, что нет четко определенного размера идентификатора. Сколько же тогда памяти выделять для хранения результата? Это легко определить. Достаточно вызвать функцию LookupAccountName, указав в качестве указателя на буфер для хранения SID и в качестве размера буфера нулевое значение. В результате функция вернет ошибку и сообщит, что недостаточно памяти в буфере. А через параметры cbSid и cbReferencedDomainName вернет нам корректные значения необходимых буферов. Теперь мы знаем все необходимое. |