Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_po_sp.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
308.78 Кб
Скачать
  1. Работа с идентификаторами безопасности

Структура идентификатора безопасности

Идентификатор безопасности (SID) является бинарным представлением учетной записи, которое используется операционной системой для управления доступом к объектам. В операционных системах Windows идентификаторы безопасности представляются структурой

следующего типа:

typedef struct _SID {

BYTE Revision; // версия SID

BYTE SubAuthorityCount; // количество относительных идентификаторов

SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // авторизация

DWORD SubAuthority[ANYSIZE_ARRAY]; // относительные идентификаторы

} SID;

Отсюда видно, что структура sid имеет переменную длину, которая зависит от количества относительных идентификаторов учетной записи. Идентификатор безопасности должен содержать идентификатор учетной записи, который хранится в поле IdentifierAuthority И, по крайней мере, один относительный идентификатор учетной записи. Идентификатор учетной записи, который определяет ее уровень авторизации или, другими словами, принадлежность учетной записи какому-то множеству учетных записей, задается структурой типа:

typedef struct _SID_IDENTIFIER_AUTHORITY {

BYTE Value[6]; // значение идентификатора учетной записи

} SID.IDENTIFIER.AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;

Так как структура sid имеет переменную длину, зависящую от количества относительных идентификаторов учетной записи, то, прежде чем создавать идентификатор безопасности,

нужно определиться с количеством относительных идентификаторов, а затем зарезервировать память для структуры sid. Для определения длины структуры sid, учитывая количество относительных идентификаторов, используется функция GetSidLengthRequired. После этого резервируется Память для структуры sid. Сама структура sid инициализируется при помощи функции InitializeSid, причем эта функция инициализирует только первые три члена структуры sid. Относительные идентификаторы должны инициализироваться отдельно, вручную. Для вычисления адреса относительного идентификатора безопасности по его индексу в структуре sid используется функция GetSidSubAuthority. После инициализации sid нужно проверить его структуру — для этого используется функция isvaiidsid. Все вышеперечисленные действия можно также выполнить одной функцией

AiiocateAndinitiaiizeSid, которая резервирует память для структуры типа sid и инициализирует ее. Однако в этом случае зарезервированную память нужно освобождать, используя функциию FreeSid.

Для определения длины буфера памяти, который потребуется для создания

Идентификатора безопасности, ИСПОЛЬЗуеТСЯ фуНКЦИЯ GetSidLengthRequired,

которая имеет следующий прототип:

DWORD GetSidLengthRequired(

UCHAR nSubAuthorityCount // количество относительных идентификаторов

);

Единственный параметр этой функции должен содержать количество

относительных идентификаторов, которые предполагается записать в идентификатор безопасности. Функция GetSidLengthRequired всегда успешно завершает свою работу и возвращает количество байт, требуемых для хранения идентификатора безопасности.

Для инициализации идентификатора безопасности используется функция

InitializeSid, которая имеет следующий прототип:

BOOL InitializeSid(

PSID pSid, // указатель на идентификатор безопасности

// указатель на идентификатор учетной записи

PSID_IDENTIFIER_AUTHORITY pldent i f ierAuthori ty,

BYTE nSubAuthorityCount // количество относительных идентификаторов

);

В случае успешного завершения функция InitializeSid возвращает

ненулевое значение, а в случае неудачи — false. При неудаче код ошибки

можно определить посредством вызова функции GetLastError.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]