Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторна робота 2

Работа добавлена на сайт samzan.net:


Лабораторна робота №2. Функції управління групами в ОС Windows.

Теоретична частина

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;

}

2. Отримання інформації про локальну групу

Для отримання інформації про локальну групу використовується функція NetLocalGroupGetinfo, яка має наступний прототип:

NET_API_STATUS NetLocalGroupGetinfo(

LPCWSTR servername, // ім’я сервера

LPCWSTR groupname, // ім’я групи

DWORD level, // рівень інформації

LPBYTE *bufptr // буфер для інформації

);

Відзначимо, що успішно цю функцію можуть виконати тільки користувачі, які є адміністраторами або операторами облікових записів.

У разі успішного завершення функція NetLocalGroupGetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:

  •  error_access_denied — користувачеві відмовлено в доступі;
  •  NERR_invalidComputer — неправильне ім’я комп’ютера;
  •  error_no_such_alias — група з таким ім’ям не існує.

Параметри функції NetLocalGroupGetinfo мають наступне призначення.

Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.

Параметр groupname повинен указувати на рядок з ім’ям локальної групи, про яку отримують інформацію. Цей рядок повинен мати кодування Unicode.

Параметр level указує тип структури, яка містить інформацію про локальну групу. Цей параметр може приймати тільки одне значення — 1, яке вказує на те, що використовується структура типу localgroup_info_1;

Параметр bufptr повинен містити адресу покажчика, в який система запише адресу буфера з інформацією про локальні групи. Пам’ять під буфер розподіляється системою. Тому після прочитання інформації з буфера В лістингу 2 приведена програма, яка отримує інформацію про локальну Групу, використовуючи для цього функцію NetLocalGroupGetinfo.

Лістинг 2. Отримання інформації про локальну групу

#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];            // ім’я локальної групи

 LOCALGROUP_INFO_1  *buf_ptr = NULL;    // адрес буфера для даних

 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);         // вводимо ім’я групи

 // отримуємо інформацію про локальну групу

 ret_status = NetLocalGroupGetInfo(

   server_name,           // ім’я сервера

   group_name,            // ім’я групи

   1,                     // отримуємо ім’я групи і коментар

   (LPBYTE*)&buf_ptr);    // вказівник на адресу буфера для даних

 // перевіряємо завершення функції

 if (ret_status != NERR_Success)

 {

   printf("Net local group get info failed.\n");

   NetApiBufferFree(buf_ptr);  // звільняємо буфер для даних

   return ret_status;

 }

 // виводимо на консоль ім’я локальної групи і коментар

 wprintf(L"Local group name: %s\n", buf_ptr->lgrpi1_name);

 wprintf(L"Comment: %s\n", buf_ptr->lgrpi1_comment);

 NetApiBufferFree(buf_ptr);     // звільняємо буфер для даних

 return 0;

}

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;

1002 — використовується структура типу localgroup_info_1002.

Параметр buf повинен указувати на буфер з інформацією про локальну групу. Інформація повинна зберігатися в структурі, тип якої заданий параметром level.

У змінну, на яку указує параметр parm_err, функція NetLocalGroupSetinfo поміщає індекс першого поля в структурі з інформацією про локальну групу, яке містить неправильні дані і, як наслідок, викликало завершення функції NetLocalGroupSetinfo з помилкою.

У подвійне слово, на яке указує параметр, функція NetLocalGroupSetinfo може записати одне з наступних значень:

  •  localgroup_name_parmnum — неправильне ім’я групи;
  •  localgroup_comment_parmnum — неправильний коментар.

У цьому параметрі може бути встановлене значення null. В цьому випадку індекс поля з неправильними даними не повертається.

Тепер опишемо структуру localgroup_info_0, яка має наступний тип:

typedef struct _LOCALGROUP_INFO_0 {

LPWSTR igrpi0_name; // ім’я групи

}LOCALGROUP_INFO_0, * PLOCALGROUP_INFO_0, * LPLOCALGROUP_INFO_0;

У єдиному полі igrpi0_name зберігається покажчик на рядок з ім’ям локальної групи. Довжина рядка не повинна перевищувати gnlen байт, а сам рядок повинен мати кодування Unicode.

У лістингу 4 приведена програма, яка змінює ім’я локальної групи, використовуючи для цього функцію NetLocalGroupSetlnfo.

Лістинг 4. Зміна імені локальної групи

#include <stdio.h>

#include <windows.h>

#include <lm.h>

#pragma comment( lib, "netapi32.lib" )   // підключаємо мережеву бібліотеку

int main()

{

 wchar_t server_name[256]= L"\\\\";    // ім’я сервера

 wchar_t  old_name[GNLEN];        // старе ім’я локальної групи

 wchar_t  new_name[GNLEN];        // нове ім’я локальної групи

 wchar_t comment[MAXCOMMENTSZ];   // новий коментар

LOCALGROUP_INFO_0 group_info_0;  // інформація про ім’я групи

 LOCALGROUP_INFO_1 group_info_1;  // опис нової групи

 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", old_name);         // вводимо ім’я групи

printf("Input а new name for the group: ");

 wscanf(L"%s", new_name);         // вводимо нове ім’я групи

 // встановлюємо адресу імені в структуру

 group_info_0.lgrpi0_name = new_name;

// змінюємо ім’я групи

 ret_status = NetLocalGroupSetInfo(

   server_name,       // ім’я сервера

   old_name,          // ім’я групи

   0,                 // нове ім’я групи

   (LPBYTE)&group_info_0,  // нова інформація про групу

   NULL);             // індексування інформації немає

 // перевіряємо завершення функції

 if (ret_status != NERR_Success)

 {

   printf("Net local group set name failed.\n");

   return ret_status;

 }

 printf("Local group name was changed.\n");

printf("Input group comments: ");

 getwchar();          // очищаємо потік

 _getws(comment);     // читаємо коментарі про користувача

  // встановлюємо новий коментар

 group_info_1.lgrpi1_comment = comment;

 // змінюємо опис групи

 ret_status = NetLocalGroupSetInfo(

   server_name,       // ім’я сервера

new_name,          // ім’я групи

   1,                 // отримуємо ім’я групи і коментар

   (LPBYTE)&group_info_1,  // новий опис групи

   NULL);             // індексування інформації немає

 // перевіряємо завершення функції

 if (ret_status != NERR_Success)

 {

   printf("Net local group set info failed.\n");

   return ret_status;

 }

 printf("Local group comment was changed.\n");

 return 0;

}

5. Додавання членів локальної групи

Для додавання нових членів в локальну групу використовується функція NetLocalGroupAddMembers, Яка має наступний прототип:

NET_API_STATUS NetLocalGroupAddMembers(

LPCWSTR servername, // імя сервера

LPCWSTR groupname, // імя групи

DWORD level, // рівень інформації

LPBYTE buf, // буфер з інформацією

DWORD totalentries // кількість членів, що включаються

);

У разі успішного завершення функція NetLocalGroupAddMembers повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:

  •  NERR_GroupNotFound — група не знайдена;
  •  error_no_such_member — не існує членів, які додаються в групу;
  •  error_member_in_alias — деякі члени вже є членами групи;
  •  error_invalid_member — неправильний тип облікового запису члена, що додається.

Параметри функції NetLocalGroupAddMembers мають наступне призначення.

Параметр servername повинен указувати на рядок з ім’ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп’ютері, то цей параметр повинен мати значення null.

Параметр groupname повинен указувати на рядок з ім’ям групи, в яку додаються нові члени. Цей рядок повинен мати кодування Unicode.

Параметр level указує тип структури, яка містить інформацію про членів, що додаються в групу. Цей параметр може приймати одне з наступних значень:

0 — використовується структура типу localgroup_members_info_0;

3 — використовується структура типу localgroup_members_info_3.

Параметр buf повинен указувати на буфер з інформацією про членів, які додаються в локальну групу. Інформація повинна зберігатися в структурах, тип яких заданий параметром level.

Параметр totaientries повинен містити розмірність масиву структур, на який указує параметр buf.

Тепер приведемо типи структур, на які може указувати параметр level.

Структура localgroup_members_info_o має наступний тип:

typedef struct _LOCALGROUP_MEMBERS_INFO_0 {

PSID lgrmi0_sid; // покажчик на ідентифікатор безпеки

} LOCALGROUP_MEMBERS_INFO_0, * PLOCALGROUP_MEMBERS_INFO_0,

*LPLOCALGROUP_MEMBERS_INFO_0 ;

У єдиному полі igrmi0_sid цієї структури зберігається покажчик на ідентифікатор безпеки члена, який додається в локальну групу.

Структура localgroup_members_info_3 має наступне визначення:

typedef struct _LOCALGROUP_MEMBERS_INFO_3 {

LPWSTR lgrmi3_domainandname; // покажчик на імя облікового запису

} LOCALGROUP_MEMBERS_INFO_3 , * PLOCALGROUP_MEMBERS_INFO_3 ,

*LPLOCALGROUP_MEMBERS_INFO_3 ;

У єдиному полі igrmi3_domainandname цієї структури зберігається покажчик на рядок з ім’ям облікового запису, який стає членом групи. Цей рядок повинен мати кодування Unicode, а ім’я повинне бути задане у форматі: <ім’я_домену>\ <ім’я_облікового_запису>.

Тепер перейдемо до прикладів. Спочатку, в лістингу 5, приведемо програму, яка додає члена локальної групи по його імені, використовуючи для цього функцію NetLocalGroupSetInfо.

Лістинг 5. Додавання члена локальної групи по імені

#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 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 a 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 = NetLocalGroupAddMembers(

   server_name,           // ім’я сервера

   group_name,            // ім’я групи

3,                     // рівень інформації

   (LPBYTE)&member_info,  // ім'я облікового запису

   1);                    // додаємо одного члена групи

 if (ret_status != NERR_Success)

 {

   printf("Ret status: %d\n", ret_status);

   printf("Net local group add members failed.\n");

   return ret_status;

 }

 printf("The member is added.\n");

 return 0;

}

Тепер, в лістингу 6, приведемо програму, яка додає члена локальної групи по його ідентифікатору безпеки, використовуючи для цього функцію NetLocaiGroupSetmfo. Відмітимо, що в цій програмі ідентифікатор безпеки облікового запису визначається за допомогою функції LookupAccountName.

Лістинг 6. Додавання члена локальної групи по дескриптору безпеки

#ifndef UNICODE

#define UNICODE

#endif

#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 user_name[UNLEN];                // ім'я користувача

 LOCALGROUP_MEMBERS_INFO_0  member_info;  // інформація про члена групи

 NET_API_STATUS  ret_status;    // код повернення з функції

 DWORD  dwErrCode;

 DWORD  dwLengthOfSID = 0;          // довжина SID

 DWORD  dwLengthOfDomainName = 0;   // довжина імені домену

 PSID  lpSID = NULL;                // вказівник на SID

 LPTSTR  lpDomainName = NULL;       // вказівник на ім’я домену

 SID_NAME_USE type_of_SID;          // тип облікового запису

 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 a user name: ");

 wscanf(L"%s", user_name);          // вводимо ім'я користувача

// визначаємо довжину SID користувача

 LookupAccountName(

   NULL,              // шукаємо ім'я на

локальному комп'ютері     user_name,         // ім'я

користувача

   NULL,              // визначуваний довжину SID

   &dwLengthOfSID,    // довжина SID

   NULL,              // визначуваний ім'я домена

   &dwLengthOfDomainName,   // довжина імені домена

   &type_of_SID);     // тип облікового запису

 // перевіряємо, чи повернула функція довжину SID

 if (dwLengthOfSID == 0)

 {

   dwErrCode = GetLastError();

   printf("Lookup account name failed.\n");

   printf("Error code: %d\n", dwErrCode);

   return dwErrCode;

 }

 // розподіляємо пам'ять для SID і імені домена

 lpSID = (PSID) new char[dwLengthOfSID];

 lpDomainName = (LPTSTR) new char[dwLengthOfDomainName];

// визначаємо 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;

 }

// роздруковуємо ім'я домена

 wprintf(L"%s\n", lpDomainName);

 // встановлюємо SID в інформацію про члена групи

 member_info.lgrmi0_sid = lpSID;

 // додаємо користувача в локальну групу

 ret_status = NetLocalGroupAddMembers(

server_name,     // ім'я сервера

   group_name,      // ім'я групи

   0,               // рівень інформації

   (LPBYTE)&member_info,  // інформація про SID

   1);              // додаємо одного члена групи

 if (ret_status != NERR_Success)

 {

   printf("Net local group add members failed.\n");

   return ret_status;

 }

 printf("The member is added.\n");

 return 0;

}

6. Видалення членів локальної групи

Для видалення членів локальної групи використовується функція NetLocalGroupDelMembers, яка має наступний прототип:

NET_API_STATUS NetLocalGroupDelMembers(

LPCWSTR servername, // ім'я сервера

LPCWSTR groupname, // ім'я групи

DWORD level, // рівень інформації

LPBYTE buf, // буфер з інформацією

DWORD totalentries // кількість структур в буфері

);

У разі успішного завершення функція NetLocalGroupDelMembers повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:

  •  NERR_GroupNotFound — група не знайдена;
  •  error_no_such_member — не існує членів, які віддаляються з групи;
  •  error_member_in_alias — деякі облікові члени не є членами локальної групи, тому з групи не був видалений жоден член.

У лістингу 7 приведена програма, яка видаляє члена локальної групи по імені за допомогою функції NetLocalGroupDelMembers.

Лістинг 7. Видалення члена локальної групи по імені

#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 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;

}

Практичне завдання:

  1.  Набрати та відлагодити всі наведені в теоретичних відомостях лістинги.
  2.  Написати програму, яка буде створювати локальні групи з іменами що задаються маскою. Наприклад:
    group@, 11,12,13,21,22,23,24 group11, group12, group13, group21, group22
    group-@, 11-16  group11, group12, group13 group16
  3.  Написати програму виведення інформації про групи, які задовольняють умовам фільтру. Наприклад:
    m*  managers, men, mykolajiv_dep, minskSellers
  4.  Написати програму видалення користувача за введеним ідентифікатором безпеки користувача.




1. Складові ланки та грошові потоки міжнародних фінансів Міжнародні фінансові відносини являють собою доси
2. до 018м.кв. Габарит витража ммmin Модель Фото Витраж за 1
3. Тема- Диффузный токсический зоб Тюмень 2011 1
4. тематики КУРСОВАЯ РАБОТА Схема управления электродвигателем объекта.html
5. Данная задача решается в Excel с помощью специального средства ~ фильтрации
6. НА ТЕМУ- Внешняя политика СССР в предвоенные годы 30ые 40ые г
7. Построение корреляции исследуемых зависимостей
8. Введение3 PR и связи с общественностью
9. Тема 1 Ключові поняття науки і наукових досліджень Рекомендовані терміни для укладання глосарію- наука фун
10. Правила промышленной безопасности для нефтеперерабатывающих производств
11. экономических процессов
12. Об образовании Типовое положение о дошкольном образовательном учреждении Утверждено Постановлением П
13. 13 Экономика и организация внешней торговли
14. Билеты по географии
15. Роль рек в освоении и заселении Сибири
16. Сказки сюжеты и сценарии современной России
17. Тема 22- Политические процессы выполнил- студент IV курса факу
18. He plnted huge cross on the shore nd siled home with the news tht he hd reched north est Chin the lnd of the Gret Khn nd tht the se ws full of fish
19. Контрольная работа 3 2012г.
20. Закон зберження електричного заряду