
- •Лабораторна робота №4. Функції роботи з ідентифікаторами безпеки. Теоретична частина
- •1. Основні поняття
- •2. Структура ідентифікатора безпеки
- •3. Створення ідентифікатора безпеки
- •4. Визначення облікового запису по ідентифікатору безпеки
- •5. Визначення ідентифікатора безпеки по імені облікового запису
- •6. Отримання характеристик ідентифікатора безпеки
- •Практичне завдання:
6. Отримання характеристик ідентифікатора безпеки
Для визначення довжини ідентифікатора безпеки використовується функція GetLengthsid, яка має наступний прототип, :
DWORD GetLengthSid (
PSID pSid // покажчик на SID
);
Єдиним параметром цієї функції є покажчик на ідентифікатор безпеки. Якщо ідентифікатор безпеки має правильну структуру, то функція повертає довжину цього ідентифікатора безпеки, інакше - повертане значення не визначене. Тому перед викликом функції GetLengthSid треба викликати функцію IsValidSid, яка перевіряє структуру ідентифікатора безпеки.
Для визначення покажчика на ідентифікатор авторизації в структурі Sid використовується функція GetSidldentifierAuthority, яка має наступний прототип, :
PSID_IDENTIFIER_AUTHORITY GetSidldentifierAuthority (
PSID pSid // покажчик на SID
);
Єдиним параметром цієї функції є покажчик на ідентифікатор безпеки. Якщо ідентифікатор безпеки має правильну структуру, то функція Повертає покажчик на полі IdentifierAuthority в ідентифікаторі безпеки, інакше - повертане значення Не визначене. тому перед викликом функції GetSidldentifierAuthority треба викликати функцію isVaiidsid, яка перевіряє структуру ідентифікатора безпеки.
Для визначення кількості відносних ідентифікаторів в ідентифікаторі безпеки використовується функція GetsidsubauthorityCount, яка має наступний прототип, :
PUCHAR GetSidSubAuthorityCount(
PSID pSid // покажчик на SID
);
Єдиним параметром цієї функції є покажчик на ідентифікатор безпеки. Якщо ідентифікатор безпеки має правильну структуру, то функція повертає покажчик на полі SubAuthorityCount в ідентифікаторі безпеки, інакше - повертане значення не визначене. Тому перед викликом функції GetsidsubauthorityCount треба викликати функцію IsValidSid, яка перевіряє структуру ідентифікатора безпеки.
Після того, як отримана кількість відносних ідентифікаторів, адресу конкретного відносного ідентифікатора можна визначити за допомогою виклику функції GetsidsubAuthority.
У лістингу 4 приведена програма, яка виводить на консоль вміст ідентифікатора безпеки, використовуючи описані раніше функції.
Лістинг 4. Отримання характеристик ідентифікатора безпеки
##include <stdio.h>
##include <windows.h>
##include <lm.h>
##pragma comment( lib, "netapi 32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256]= L"\\\\"; // ім 'я сервера
wchar_t group_name[GNLEN]; // ім 'я локальної групи
wchar_t user_name[UNLEN]; // ім 'я користувача
LOCALGROUP_MEMBERS_INFO_3 member_info; // інформація про
члена групи
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// // формуємо ім 'я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a local group name: ");
wscanf(L"%s", group_name); // ім, що вводиться, 'я групи
printf("Input а domain name: ");
wscanf(L"%s", user_name); // ім, що вводиться, 'я домена
wcscat(user_name, L"\\"); // приєднуємо символ '\'
printf("Input а user name: ");
// // ім, що вводиться, 'я користувача
wscanf(L"%s", user_name + wcslen(user_name));
// // встановлюємо інформацію про користувача
member_info.lgrmi3_domainandname = user_name;
// // видаляємо користувача з локальної групи
ret_status = NetLocalGroupDelMembers(
server_name, // ім 'я сервера
group_name, // ім 'я групи
3, // рівень інформації
( (LPBYTE)&member_info, // інформація
про SID
1); // додаємо одного члена групи
if (ret_status != NERR_Success)
{
printf("Net local group del members.\n");
return ret_status;
}
printf("The member is deleted.\n");
return 0;
}