- •Лабораторна робота №4. Функції роботи з ідентифікаторами безпеки. Теоретична частина
- •1. Основні поняття
- •2. Структура ідентифікатора безпеки
- •3. Створення ідентифікатора безпеки
- •4. Визначення облікового запису по ідентифікатору безпеки
- •5. Визначення ідентифікатора безпеки по імені облікового запису
- •6. Отримання характеристик ідентифікатора безпеки
- •Практичне завдання:
5. Визначення ідентифікатора безпеки по імені облікового запису
Для визначення ідентифікатора безпеки по імені облікового запису використовується функція LookupAccountName, Яка має наступний прототип, :
BOOL LookupAccountName (
LPCSTR IpSystemName, // ім'я системи
LPCSTR lpAccountName, // ім'я облікового запису
PSID pSid, // буфер для ідентифікатора безпеки
LPDWORD cbSid, // довжина буфера для ідентифікатора
LPSTR ReferencedDomainName, // буфер для імені домена
LPDWORD cbReferencedDomainName, // довжина буфера для імені домена
PSID_NAME_USE peUse // тип облікового запису
);
Пошук облікового запису виконується в наступному порядку: спочатку перевіряються зумовлені загальновідомі облікові записи, потім перевіряються облікові записи, зареєстровані на локальному комп'ютері, після цього перевіряються облікові записи, зареєстровані в первинному домені, і, в останню чергу, перевіряються облікові записи з довірчих доменів.
Параметри функції LookupAccountName мають наступне призначення.
Параметр lpSystemName повинен вказувати на рядок з ім'ям комп'ютера, на якому шукається ім'я облікового запису. Якщо цей параметр має значення null, то обліковий запис шукається на локальному комп'ютері.
Параметр lpAccountName повинен вказувати на рядок з ім'ям облікового запису, для якого визначається ідентифікатор безпеки і ім'я домена.
Параметр pSid повинен містити адресу буфера, в який функція запише структуру Sid. Якщо встановити значення цього параметра в null, то функція запише в подвійне слово, на яке вказує параметр cbSid, необхідну довжину буфера для ідентифікатора безпеки.
Параметр ReferencedDomainName повинен містити адресу буфера, в який функція запише ім'я домена, в якому знайдений обліковий запис.
Параметр cbReferencedDomainName повинен вказувати на змінну типу dword, яка містить довжину буфера для імені домена, на який вказує параметр ReferencedDomainName. якщо довжина буфера недостатня, то виконання функції закінчиться невдачею, а в змінну, на яку вказує параметр cbReferencedDomainName, функція запише необхідну довжину буфера. Якщо в параметрі ReferencedDomainName встановлено значення null, то змінна, на яку вказує параметр cbReferencedDomainName, повинна містити 0.
Параметр peUse повинен вказувати на змінну типу sid_name_use, в яку функція запише тип облікового запису. Можливі значення цього перерахування були приведені в попередньому розділі.
У лістингу 3 приведена програма, яка визначає ідентифікатор безпеки і ім'я домена по імені облікового запису, використовуючи для цього ФУНКЦІЮ LookupAccountName.
Лістинг 3. Визначення ідентифікатора безпеки по імені облікового запису
##ifndef UNICODE
##define UNICODE
##endif
##include <stdio.h>
##include <windows.h>
##include <lm.h>
int main()
{
wchar_t user_name[UNLEN]; // ім'я користувача
DWORD dwErrCode; // код повернення
DWORD dwLengthOfSID = 0; // довжина SID
DWORD dwLengthOfDomainName = 0; // довжина імені домена
DWORD dwLengthOfUserName = UNLEN; // довжина імені облікового запису
SID *lpSID = NULL; // покажчик на SID
LPTSTR lpDomainName = NULL; // покажчик на ім'я домена
SID_NAME_USE type_of_SID; // тип облікового запису
printf("Input a user name: ");
wscanf(L"%s", user_name); // вводимо ім'я користувача
// // визначаємо довжину SID користувача
if (!LookupAccountName(
NULL, // шукаємо ім'я на локальному комп'ютері
user_name, // ім'я користувача
NULL, // визначаємо довжину SID
& &dwLengthOfSID, // довжина SID
NULL, // визначаємо ім'я домена
& &dwLengthOfDomainName, // довжина імені домена
& &type_of_SID)) // тип облікового запису
{
dwErrCode = GetLastError();
if (dwErrCode == ERROR_INSUFFICIENT_BUFFER)
{
// // розподіляємо пам'ять для SID і імені домена
lpSID = (SID*) new char[dwLengthOfSID];
lpDomainName = (LPTSTR) new wchar_t[dwLengthOfDomainName];
}
else
{
// // виходимо з програми
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwErrCode);
return dwErrCode;
}
}
// // визначуваний SID і ім'я домена користувача
if(!LookupAccountName(
NULL, // шукаємо ім'я на локальному комп'ютері
user_name, // ім'я користувача
lpSID, // покажчик на SID
& &dwLengthOfSID, // довжина SID
lpDomainName, // покажчик на ім'я домена
& &dwLengthOfDomainName, // довжина імені домена
& &type_of_SID)) // тип облікового запису
{
dwErrCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwErrCode);
return dwErrCode;
}
// // виводиться SID на консоль
printf("SID revision: %u\n", lpSID ->Revision);
printf("SubAuthorityCount: %u\n", lpSID ->SubAuthorityCount);
printf("IdentifierAuthority: ");
for (int i = 0; i < 6; ++i)
printf("%u ", lpSID ->IdentifierAuthority.Value[i]);
printf("\n");
printf("SubAuthorities: ");
for (i = 0; i < lpSID ->SubAuthorityCount; ++i)
printf("%u ", lpSID ->SubAuthority[i]);
printf("\n");
// // виводимо ім'я домена
wprintf(L" Domain name: %s\n", lpDomainName);
delete[] lpDomainName;
delete[] lpSID;
return 0;
}
