
- •Навчальні та виховні цілі:
- •1. Функції для роботи з привілеями
- •1.1. Ініціалізація локального ідентифікатора
- •1.2. Отримання локального ідентифікатора і імені привілею
- •1.3. Отримання імені привілею для відображення
- •2. Робота з маркерами доступу
- •2.1. Відкриття маркера доступу процесу
- •2.3. Структури, використовувані для роботи з маркером доступу
- •2.4. Отримання інформації з маркера доступу
- •2.5. Зміна інформації в маркері доступу
- •2.6. Налаштування привілеїв
- •2.7. Налаштування груп
- •2.8. Створення маркера обмеженого доступу
2.4. Отримання інформації з маркера доступу
Для отримання інформації з маркера доступу використовується функція GetTokenInformation, яка має наступний прототип:
BOOL GetTokenInformation(
HANDLE TokenHandle, // дескриптор маркера доступу
TOKEN_INFORMATION_CLASS TokenInformationClass, // тип інформації
LPVOID TokenInformation, // покажчик на буфер для інформації
DWORD TokenInformationLength, // довжина буфера
PDWORD ReturnLength // необхідна довжина буфера
);
В разі вдалого завершення функція поверне ненульове значення, а в разі невдачі — FALSE. Код помилки в разі невдалого завершення функції можна отримати за допомогою виклику функції GetLastError. Параметри функції GetTokenInformation мають наступне призначення.
Параметр TokenHandle повинен містити дескриптор маркера доступу, з якого витягується інформація. Причому цей дескриптор має бути відкритий в режимі token_query_source, якщо витягується інформація про джерело маркера доступу і в режимі token_query для отримання інформації іншого типу.
Параметр TokenInformationClass повинен містити одне із значень перерахування типу token_information_class, яке вказує, яку інформацію з маркера доступу повинна повернути функція. Перелік типу token_information_class визначене таким чином:
typedef enum _TOKEN_INFORMATION_CLASS {
TokenUser = 1, // інформація про користувача
TokenGroups, // інформація про групи, пов'язані з маркером доступу
TokenPrivileges, // інформація про привілеї
TokenOwner, // інформація про власника об'єкту за умовчанням
TokenPrimaryGroup, // інформація про первинну групу власника
// об'єкту за умовчанням
TokenDefaultDacl, // інформація про список DACL об'єкту за умовчанням
TokenSource, // джерело маркера доступу
TokenType, // тип маркера доступу
TokenImpersonationLevel, // рівень заміщення маркера доступу
TokenStatistics, // статистика
TokenRestrictedSids, // список обмежуючих ідентифікаторів
// безпеці
TokenSessionId // ідентифікатор сесії
} TOKEN_INFORMATION_CLASS * PTOKEN_INFORMATION_CLASS ;
Параметр TokenInformation повинен вказувати на буфер, в який функція помістить інформацію, витягувану з маркера доступу. Залежно від значення, заданого параметром TokenInformationClass, інформація про маркер доступу записана в структурному вигляді або має значення деякого перелічуваного типу. Нижче наведена відповідність значень константи типу TOKEN_INFORMATION_CLASS і типів, використовуваних для представлення відповідної інформації про маркер доступу, що перераховує:
TokenUser — tokenuser;
TokenGroups — token_groups;
TokenPrivileges — token_privileges;
TokenOwner — token_owner;
TokenPrimaryGroup — token_primary_group;
TokenDefaultDacl — token_default_dacl;
TokenSource — token_source;
TokenType — token_type;
TokenlmpersonationLevel — security_impersonation_level;
TokenStatistics — token_statistics;
TokenRestrictedSids — token_groups;
TokenSessionld — dword.
У параметрі TokenInformation може бути також встановлене значення NULL. В цьому випадку функція запише за адресою, заданою останнім параметром, необхідну довжину буфера.
Параметр TokenInformationLength повинен містити довжину буфера, на який вказує параметр TokenInformation. Якщо в параметрі TokenInformation встановлено значення NULL, то в параметрі TokenInformationLength має бути встановлене значення 0.
У параметрі ReturnLength має бути встановлена адреса подвійного слова, в яке функція поверне необхідну довжину буфера, якщо в параметрі TokenInformation встановлено значення NULL або задана довжина буфера недостатня для запису необхідної інформації.
У лістингу 7.3.4 (Додаток А) приведена програма, в якій функція GetTokenInformation використовується для визначення джерела маркера доступу.
Програма в якій функція GetTokenInformation використовується для визначення всіх привілеїв маркера доступу приведена в лістингу 7.3.5. (Додаток А).