
- •Лабораторна робота №5. Функції роботи з дескрипторами безпеки. Теоретична частина
- •1. Створення локальної групи
- •2. Отримання інформації про локальну групу
- •3. Перерахування локальних груп
- •4. Зміна інформації про локальну групу
- •1002 — Використовується структура типу localgroup_info_1002.
- •5. Додавання членів локальної групи
- •6. Видалення членів локальної групи
- •Практичне завдання:
Лабораторна робота №5. Функції роботи з дескрипторами безпеки. Теоретична частина
1. Створення локальної групи
Для створення облікового запису локальної групи в базі даних менеджера облікових записів використовується функція NetLocalGroupAdd, яка має наступний прототип:
NET_API_STATUS NetLocalGroupAdd(
LPCWSTR servername, // ім’я сервера
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
LPDWORD parm_err // індексування помилки
);
У разі успішного завершення функція NetLocaiGroupAdd повертає значення NERR_Success, а у разі невдачі можливі наступні коди завершення:
error_access_denied — користувачеві відмовлено в доступі;
NERR_invaiidcomputer — неправильне ім’я комп’ютера;
NERR_NotPrimary — операція може виконуватися тільки на первинному контроллері домена;
NERR_GroupExists — група вже існує;
error_alias_exists — група вже існує.
Параметри функції NetLocaiGroupAdd мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати одне з наступних значень:
0 — використовується структура типу localgroup_info_0;
1 — використовується структура типу localgroup_info_1.
У прикладі буде використана структура типу localgroup_info_1, опис якої і буде приведено після опису функції. Опис типу структури localgroup_info_0 може бути знайдений в MSDN.
Параметр buf повинен указувати на буфер з інформацією про локальну групу. Інформація повинна зберігатися в структурі, тип якої заданий параметром level.
У змінну, на яку указує параметр parm_err, функція NetLocaiGroupAdd поміщає індекс першого поля в структурі з інформацією про локальну групу, яке містить неправильні дані і, як наслідок, викликає завершення функції NetLocaiGroupAdd з помилкою. У цьому параметрі може бути встановлене значення null. В цьому випадку індекс поля з неправильними даними не повертається.
Оскільки в лістингу буде використана структура типу localgroup_info_1, то приведемо тип і опишемо призначення полів цієї структури. Структура localgroup_info_1 має наступний тип:
typedef struct _LOCALGROUP_INFO_1 {
LPWSTR lgrpi1_name; // ім’я групи
LPWSTR lgrpi1_comment; // коментарі
}LOCALGROUP_INFO_1, * PLOCALGROUP_INFO_1, * LPLOCALGROUP_INFO_1;
Поля цієї структури мають наступне призначення.
У полі igrpil_name зберігається покажчик на рядок з ім’ям локальної групи. Довжина рядка не повинна перевищувати gnlen байт, а сам рядок повинен мати кодування Unicode.
У полі igrpil_comment зберігається покажчик на рядок з коментарями щодо локальної групи. Довжина рядка не повинна перевищувати maxcommentsz байтів, а сам рядок повинен мати кодування Unicode.
У лістингу 1 приведена програма, яка створює локальну групу, використовуючи для цього функцію NetLocalGroupAdd.
Лістинг 1. Створення локальної групи
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256]= L"\\\\"; // ім’я сервера
wchar_t group_name[GNLEN]; // ім’я локальної групи
wchar_t comment[MAXCOMMENTSZ]; // коментар про групу
LOCALGROUP_INFO_1 group_info; // інформація про групу
NET_API_STATUS ret_status; // код повернення з функції
printf("Input server name: ");
// формуємо ім’я сервера
wscanf(L"%s", server_name + wcslen(server_name));
printf("Input a name for the local group: ");
wscanf(L"%s", group_name); // вводимо ім’я групи
group_info.lgrpi1_name = group_name; // встановлюємо адрес імені в структуру
printf("Input group comments: ");
getwchar(); // очищаємо потік
_getws(comment); // читаємо коментар про локальну групу
group_info.lgrpi1_comment = comment; // встановлюємо коментар
// створюємо локальну групу
ret_status = NetLocalGroupAdd(
server_name, // ім’я сервера
1, // рівень вхідних даних
(LPBYTE)&group_info, // ім’я групи і коментарі
NULL); // індексацію даних не використовуємо
if (ret_status != NERR_Success)
{
printf("Net local group add failed.\n");
return ret_status;
}
printf("The group is created.\n");
return 0;
}