
- •Лабораторна робота №5. Функції роботи з дескрипторами безпеки. Теоретична частина
- •1. Створення локальної групи
- •2. Отримання інформації про локальну групу
- •3. Перерахування локальних груп
- •4. Зміна інформації про локальну групу
- •1002 — Використовується структура типу localgroup_info_1002.
- •5. Додавання членів локальної групи
- •6. Видалення членів локальної групи
- •Практичне завдання:
3. Перерахування локальних груп
Для перерахування локальних груп, облікові записи яких зарегистрірованни на заданому сервері, використовується функція NetLocaiGroupEnum, яка має наступний прототип:
NET_API_STATUS NetLocaiGroupEnum(
LPCWSTR servername, // ім’я сервера
DWORD level, // рівень інформації
LPBYTE *bufptr, // буфер для інформації
DWORD prefmaxlen, // довжина буфера
LPDWORD entriesread, // кількість прочитаних структур
LPDWORD totalentries, // загальна кількість груп
LPDWORD resumehandle // дескриптор для продовження перерахування
);
У разі успішного завершення функція NetLocalGroupEnum повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
error_access_denied — користувачеві відмовлено в доступі;
error_more_data — не всі дані прочитані;
NERR_invaiidcomputer — неправильне ім’я комп’ютера;
NERR_BufTooSmaii — буфер дуже малий.
У лістингу 3 приведена програма, яка перераховує локальні групи, зареєстровані на сервері, використовуючи для цього функцію NetLocalGroupEnum.
Лістинг 3. Перерахування локальних груп
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
DWORD entries_read; // кількість елементів
DWORD total_entries; // нумерація елементів
LOCALGROUP_INFO_1 *buf_ptr = NULL; // адреса буфера для даних
NET_API_STATUS ret_status; // код повернення з функції
// перераховуємо локальні групи
ret_status = NetLocalGroupEnum(
NULL, // локальний комп’ютер
1, // отримуємо ім’я групи і коментар
(LPBYTE*)&buf_ptr, // покажчик на адресу буфера для даних
MAX_PREFERRED_LENGTH, // довжина буфера на вимогу
&entries_read, // покажчик на кількість елементів
&total_entries, // покажчик на нумерацію елементів
NULL);
// перевіряємо завершення функції
if (ret_status != NERR_Success)
{
printf("Net local group enumeration failed.\n");
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return ret_status;
}
printf("Local groups enumeration:\n");
// виводимо на консоль імена локальних груп і коментарі
for (DWORD i = 0; i < entries_read; ++i)
{
wprintf(L"Name: %s\n", buf_ptr[i].lgrpi1_name);
wprintf(L"Comment: %s\n", buf_ptr[i].lgrpi1_comment);
}
NetApiBufferFree(buf_ptr); // звільняємо буфер для даних
return 0;
}
4. Зміна інформації про локальну групу
Для зміни імені локальної групи і коментарів про локальну групу Використовується функція NetLocalGroupSetinfo, Яка Має наступний прототип:
NET_API_STATUS NetLocalGroupSetinfo(
LPCWSTR servername, // ім’я сервера
LPCWSTR groupname, // ім’я групи
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією
LPDWORD parm_err // індексування помилки
);
У разі успішного завершення функція NetLocalGroupSetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
error_access_denied — користувачеві відмовлено в доступі;
error_invalid_parameter — неправильний параметр;
error_no_such_alias — не існує вказаної локальної групи;
NERR_invalidComputer — неправильне ім’я комп’ютера;
NERR_NotPrimary — операція може виконуватися тільки на первинному контроллері домена.
Параметри функції NetLocalGroupSetinfо мають наступне призначення.
Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.
Параметр groupname повинен указувати на рядок з ім’ям групи, інформація про яку змінюється. Цей рядок повинен мати кодування Unicode.
Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати одне з наступних значень:
0 — використовується структура типу localgroup_info_0;
1 — використовується структура типу localgroup_info_1;