
- •Навчальні та виховні цілі:
- •1. Функції для роботи з привілеями
- •1.1. Ініціалізація локального ідентифікатора
- •1.2. Отримання локального ідентифікатора і імені привілею
- •1.3. Отримання імені привілею для відображення
- •2. Робота з маркерами доступу
- •2.1. Відкриття маркера доступу процесу
- •2.3. Структури, використовувані для роботи з маркером доступу
- •2.4. Отримання інформації з маркера доступу
- •2.5. Зміна інформації в маркері доступу
- •2.6. Налаштування привілеїв
- •2.7. Налаштування груп
- •2.8. Створення маркера обмеженого доступу
2.3. Структури, використовувані для роботи з маркером доступу
Програми не мають безпосереднього доступу до внутрішньої структури маркера доступу. Тому при роботі з маркерами доступу функції використовують спеціальні структури або переліки, які дозволяють отримувати інформацію з маркера доступу або змінювати необхідну інформацію в маркері доступу. Далі приведені типи структур і переліків, які використовуються при роботі з маркерами доступу.
Для отримання інформації про користувача, пов'язаного із заданим маркером доступу, використовується структура типу:
typedef struct _TOKEN_USER {
SID_AND_ATTRIBUTES User; // SID користувача і атрибути
} TOKEN_USER *PTOKEN_USER;
Структура типу sid_and_attributes визначена таким чином:
typedef struct _SID_AND_ATTRIBUTES {
PSID Sid; // покажчик на SID користувача
DWORD Attributes; // атрибути SID
} SID_AND_ATTRIBUTES * PSID_AND_ATTRIBUTES;
Атрибути ідентифікатора безпеки задаються прапорами, кожен з яких визначає деяку властивість ідентифікатора безпеки. В даний час для ідентифікатора безпеки користувача не визначені атрибути, тому це поле не використовується.
Для отримання інформації про групи, пов'язані із заданим маркером доступу, використовується структура типу:
typedef struct _TOKEN_GROUPS {
DWORD GroupCount; // кількість груп
SID_AND_ATTRIBUTES Groups [ANYSIZE_ARRAY] ; // SID і атрибути груп
} TOKEN_GROUPS *PTOKEN_GROUPS;
У полі Attributes структури типу SID_AND_ATTRIBUTES можуть бути встановлені наступні прапори:
- se_group_mandatory — не можна скинути прапор se_group_enabled;
- se_group_enabled_by_default — прапор перевірки доступу встановлений за умовчанням;
- se_group_enabled — група перевіряється при доступі до об'єкту;
- se_group_owner — користувач, пов'язаний з маркером доступу, є власником групи; або група може бути власником об'єкту;
- se_group_use_for_deny_only — група використовується тільки при перевірці заборони доступу до об'єкту;
- se_group_logon_id — sid ідентифікує сесію, що виконала вхід в систему для користувача, пов'язаного з групою;
- se_group_resource — локальна група домена.
Структура sid_and_attributes була описана вище, при описі структури типу token_user.
Для отримання інформації про привілеї, якими володіє маркер доступу, використовується структура типу:
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges [ANYSIZE_ARRAY] ;
} TOKEN_PRIVILEGES * PTOKEN_PRIVILEGES ;
У полі Attributes структури типу LUID_AND_ATTRIBUTES можуть бути встановлені наступні прапори:
- SE_PRIVILEGE_ENABLED_BY_DEFAULT — привілей встановлений за умовчанням;
- SE_PRIVILEGE_ENABLED — привілей встановлений;
- SE_PRIVILEGE_USED_FOR_ACCESS — привілей використовувався для доступу до об'єкту або сервісу.
Для отримання інформації про ідентифікатор безпеки, який використовуватиметься системою в алгоритмі установки за умовчанням власника нового об'єкту, що створюється процесом з даним маркером доступу, використовується структура типу:
typedef struct _TOKEN_OWNER {
PSID Owner; // SID власника об'єкту за умовчанням
} TOKEN_OWNER * PTOKEN_OWNER;
Відзначимо, що в цьому випадку ідентифікатор безпеки має бути ідентифікатором безпеки одного з користувачів або груп, пов'язаних з даним маркером доступу.
Для отримання інформації про ідентифікатор безпеки, який використовуватиметься системою в алгоритмі установки за умовчанням первинної групи нового об'єкту, що створюється процесом з даним маркером доступу, використовується структура типу:
typedef struct _TOKEN_PRIMARY_GROUP {
PSID PrimaryGroup; // SID первинної групи за умовчанням
} TOKEN_PRIMARY_GROUP *PTOKEN_PRIMARY_GROUP;
Відзначимо, що в цьому випадку ідентифікатор безпеки має бути ідентифікатором безпеки однієї з груп, пов'язаних з даним маркером доступу.
Для отримання інформації про список управління доступом DACL, який використовуватиметься в алгоритмі установки за умовчанням списку DACL нового об'єкту, що створюється процесом з даним маркером доступу, використовується структура типу:
typedef struct _TOKEN_DEFAULT_DACL {
PACL DefaultDacl; // покажчик на список DACL за умовчанням
} TOKEN_DEFAULT_DACL *PTOKEN_DEFAULT_DACL;
Для отримання інформації про джерело, що викликало створення даного маркера доступу, використовується структура типу:
typedef struct _TOKEN_SOURCE {
CHAR SourceName[TOKEN_SOURCE_LENGTH]; // ім'я джерела
LUID Sourceldentifier; // локальний ідентифікатор джерела
} TOKEN_SOURCE * PTOKEN_SOURCE ;
Відмітимо, що поле sourceName є простим символьним масивом, що містить ім'я джерела маркера доступу.
Інформація про тип маркера доступу представляється перелічуваною константою наступного типу:
typedef enum _TOKEN_TYPE {
TokenPrimary = 1, // первинний маркер доступу
Tokenlmpersonation // заміщаючий маркер доступу
} TOKEN_TYPE;
Інформація про рівень заміщення первинного маркера доступу представляється перелічуваною константою наступного типу:
typedef enum _SECURITY_IMPERSONATION_LEVEL {
SecurityAnonymous, // анонімний рівень заміщення
Securityldentification, // ідентифікуючий рівень заміщення
Securitylmpersonation, // рівень підміни контексту безпеки
SecurityDelegation // рівень делегування повноважень
} SECURITY_IMPERSONATION_LEVEL * PSECURITY_IMPERSONATION_LEVEL ;
Для отримання статистичних даних про маркер доступу використовується структура наступного типу:
typedef struct _TOKEN_STATISTICS {
LUID Tokenld; // локальний ідентифікатор маркера доступу
LUID Authenticationld; // локальний ідентифікатор сесії
// яку представляє маркер доступу
LARGE_INTEGER ExpirationTime; //не підтримується
TOKEN_TYPE TokenType; // тип маркера доступу
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;// рівень заміщення
DWORD DynamicCharged; // об'єм буфера, використовуваного для зберігання
// інформації про захист за умовчанням і ідентифікаторі
// безпеці первинної групи маркера доступу
DWORD DynamicAvailable; // об'єм вільної пам'яті в буфері
DWORD GroupCount; // кількість груп, пов'язаних з маркером доступу
DWORD PrivilegeCount; // кількість привілеїв, доступних в
// маркері доступу
LUID Modifiedld; // локальний ідентифікатор, який змінюється
// кожного разу при модифікації маркера доступу
} TOKEN_STATISTICS *PTOKEN_STATISTICS;
Для отримання інформації про обмежуючі ідентифікатори безпеки використовується структура типа TOKEN_GROUPS. Для отримання інформації про ідентифікатор сесії, в якій був створений маркер доступу, використовується змінна типу DWORD. Цей ідентифікатор використовується тільки в тому випадку, якщо маркер доступу був створений для термінальної сесії. У решті випадків значення цього ідентифікатора дорівнює 0.