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

Лабораторна робота 3

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

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 12.3.2025

Лабораторна робота3. Аналіз функцій управління користувачами і групами.

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

1. Перерахування груп, яким належить користувач

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

NET_API_STATUS NetuserGetGroups(

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

LPCWSTR username, // ім'я користувача

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

LPBYTE *bufptr, // адреса покажчика на буфер з інформацією

DWORD prefmaxlen, // довжина буфера з інформацією

LPDWORD entriesread, // кількість прочитаних структур

LPDWORD totalentries // загальна кількість структур

);

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

  •  error_access_denied - користувачеві відмовлено в доступі;
  •  error_more_data - не усі дані прочитані;
  •  NERR_invalidComputer - неправильне ім'я комп'ютера;
  •  NERR_userNotFound - ім'я користувача не знайдене.

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

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

Параметр username повинен вказувати на рядок з ім'ям користувача, яке перевіряється на приналежність глобальним групам для їх перерахування.

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

typedef struct _GROUP_USERS_INFO_0 {

LPWSTR gruiO_name; // ім'я користувача

} GROUP_USERS_INFO_0, *PGROUP_USERS_INFO_0/

* *LPGROUP_USERS_INFO_0;

Параметр bufptr повинен містити адресу покажчика, в який система запише адресу буфера з інформацією про глобальні групи. Пам'ять під буфер розподіляється системою. Тому після прочитання інформації з буфера цю пам'ять треба звільнити за допомогою виклику функції NetApiBuf f erFree. Цю пам'ять треба звільнити також і у тому випадку, якщо функція повернула код помилки ERROR_MORE_DATA.

Параметр prefmaxien повинен містити переважну довжину буфера в байтах. Якщо пам'яті для даних не досить, то функція поверне код помилки error_more_data. У цьому параметрі можна встановити значення max_preferred_length. В цьому випадку система сама визначить необхідну довжину буфера для інформації про облікові записи.

Параметр entriesread повинен вказувати на змінну типу dword, в яку функція запише кількість глобальних груп, імена яких записані в буфер даних.

Параметр totaientries повинен вказувати на змінну типу dword, в яку функція запише загальну кількість глобальних груп, яким належить користувач.

У лістингу 1 приведена програма, яка перераховує глобальні групи, яким належить користувач, використовуючи функцію NetUserGetGroups.

Лістинг 1. Перерахування глобальних груп, яким належить користувач

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

   GROUP_USERS_INFO_0  *ui;     // інформація про групи

   DWORD  entries_read;         // кількість прочитаних груп

   DWORD  total_entries;        // загальна кількість груп

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

   printf("Input server name: ");

 //   // формуємо ім'я сервера

   wscanf(L"%s", server_name + wcslen(server_name));

   printf("Input user name: ");

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

 //   // отримуємо інформацію про групи, в які входить користувач

   ret_status = NetUserGetGroups(

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

       user_name,         // ім'я користувача

   0,                 //     0,                 // дізнаємося імена груп

   (    (LPBYTE*)&ui,      // адреса інформації про групи

       MAX_PREFERRED_LENGTH,    // перераховуємо усі групи

   &    &entries_read,     // кількість прочитаних груп

   &    &total_entries);   // общеее кількість груп

 //   // перевіряємо на успішне завершення

   if (ret_status != NERR_Success)

   {

       printf("Net user get groups failed.\n");

       printf("Net API Status : %d\n", ret_status);

       NetApiBufferFree(ui);      // звільняємо буфер

       return ret_status;

   }

   for (DWORD i = 0; i < entries_read; ++i)

       wprintf(L" Global group name: %s\n", ui[i].grui0_name);

   NetApiBufferFree(ui);      // звільняємо буфер

   return 0;

}

2. Перерахування локальних груп, яким належить користувач

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

NET_API_STATUS NetuserGetLocaiGroups (

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

LPCWSTR username, // ім'я користувача

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

DWORD flags, // прапор непрямого пошуку

LPBYTE *bufptr, // адреса покажчика на буфер з інформацією

DWORD prefmaxlen, // довжина буфера з інформацією

LPDWORD entriesread, // кількість прочитаних структур

LPDWORD totalentries // загальна кількість структур

);

У разі успішного завершення функція NetuserGetLocaiGroups повертає значення NERR_success, а у разі невдачі можливі такі ж коди завершення, як і у разі функції NetuserGetGroups. Параметри функції NetuserGetLocaiGroups мають таке ж призначення, як і параметри функції NetuserGetGroups.

Якщо ім'я користувача в рядку, на який вказує параметр username, задано у виді ім'я_домена\ім'я_користувача, то ім'я користувача шукається в домені. Якщо ж ім'я користувача задане тільки як имяпользователя, то воно шукається на сервері, ім'я якого задане першим параметром.

Параметр flags може набувати значення lg_include_indirect. Якщо це значення встановлене, то перераховуються як локальні групи, яким користувач належить безпосередньо, так і локальні групи, яким користувач належить побічно. Тобто через членство в глобальних групах, які належать локальній групі. Інакше перераховуються тільки локальні групи, яким користувач належить тільки безпосередньо.

У лістингу 2 приведена програма, яка перераховує локальні групи, яким належить користувач, використовуючи для цього функцію NetuserGetLocaiGroups.

Лістинг 2. Перерахування локальних груп, яким належить користувач

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

   LOCALGROUP_USERS_INFO_0  *ui;        // інформація про групи

   DWORD  entries_read;     // кількість прочитаних груп

   DWORD  total_entries;    // загальна кількість груп

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

   printf("Input server name: ");

// // формуємо ім'я сервера

   wscanf(L"%s", server_name + wcslen(server_name));

   printf("Input user name: ");

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

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

   ret_status = NetUserGetLocalGroups(

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

       user_name,               // ім'я користувача

   0,                       //     0,                       // дізнаємося тільки імена груп

       LG_INCLUDE_INDIRECT,     // включаючи непряму приналежність

   (    (LPBYTE*)&ui,            // адреса інформації про групу

       MAX_PREFERRED_LENGTH,    // перераховуємо усі групи

   &    &entries_read,           // кількість прочитаних груп

   &    &total_entries);         // загальна кількість груп

 //   // перевіряємо на успішне завершення

   if (ret_status != NERR_Success)

   {

       printf("Net user get groups failed.\n");

       printf("Net API Status : %d\n", ret_status);

       NetApiBufferFree(ui);      // звільняємо буфер

       return ret_status;

   }

   for (DWORD i = 0; i < entries_read; ++i)

       wprintf(L" Local group name: %s\n", ui[i].lgrui0_name);

   NetApiBufferFree(ui);      // звільняємо буфер

   return 0;

}

3. Зміна облікового запису користувача

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

NET_API_STATUS NetUserSetlnfо(

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

LPCWSTR username, // ім'я користувача

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

LPBYTE buf, // буфер з інформацією про обліковий запис

LPDWORD parm_err // індекс поля з неправильними даними

);

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

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

  •  error_access_denied - користувачеві відмовлено в доступі;
  •  error_invalid_parameter - неправильний параметр;
  •  NERR_invaiidconputer - неправильне ім'я комп'ютера;
  •  NERR_NotPrimary - не первинний контроллер домена;
  •  NERR_speGroupOp - не дозволяється виконувати над членами спеціальної групи;
  •  NERR_LastAdmin - не дозволяється виконувати над обліковим записом адміністратора;
  •  NERR_BadPassword - неправильний Пароль;
  •  NERR_PasswordTooShort - пароль коротший, ніж вимагається;
  •  NERR_userNotFound - ім'я користувача не знайдене.

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

Параметр usemame повинен вказувати на рядок з ім'ям облікового запису, вміст якого модифікується. Цей рядок повинен мати кодування Unicode.

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

0 0 - використовується структура типу user_info_o;

1 - використовується структура типу user_info_i;

2 - використовується структура типу user_info_2;

3 - використовується структура типу user_info_3;

4 - використовується структура типу user_info_4;

21 - використовується структура типу user_info_2i;

22 - використовується структура типу user_info_22;

1003 - використовується структура типу user_info_1003;

1005 - використовується структура типу user_info_1005;

1006 - використовується структура типу user_info_ioo6;

1007 - використовується структура типу user_info_ioov,

1008 - використовується структура типу user_info_1008;

1009 - використовується структура типу user_info_ioo9;

1010 - використовується структура типу user_info_ioio;

1011 - використовується структура типу user_info_ioii;

1012 - використовується структура типу user_info_1012;

1014 - використовується структура типу user_info_1014;

1017 - використовується структура типу user_info_1017;

1020 - використовується структура типу user_info_io2o;

У лістингу буде використана структура user_info_0, яка має наступний тип:

typedef struct _USER_INFO_0 {

LPWSTR usriO_name; // ім'я користувача

}USER_INFO_0, *PUSER_INFO_0, *LPUSER_INFO_0;

Ця структура використовується у тому випадку, якщо за допомогою функції NetuserSetinfo змінюється ім'я користувача. Інші структури мають також конкретне призначення. Наприклад, структура типу user_info_1008 використовується для установки прапорів, які управляють властивостями облікового запису користувача. Опис типів інших структур можна знайти в MSDN.

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

Параметр parm_err повинен вказувати на змінну типу dword, в яку функція NetuserSetinfo помістить індекс поля в структурі з інформацією про користувача, вміст якого викликав невдале завершення функції. В цьому випадку функція NetuserSetinfo поверне значення ERROR_INVALID_PARAMETER.

У лістингу 3 приведена програма, яка змінює ім'я користувача, використовуючи функцію NetuserSetinfo.

Лістинг 3. Зміна імені користувача

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

   wchar_t new_name[UNLEN];         // нове ім'я користувача

   USER_INFO_0 ui;                  // інформація про користувача

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

   printf("Input server name: ");

// // формуємо ім'я сервера

   wscanf(L"%s", server_name + wcslen(server_name));

   printf("Input old user name: ");

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

   printf("Input new user name: ");

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

   ui.usri0_name = new_name;      // встановлюємо нове ім'я користувача

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

   ret_status = NetUserSetInfo(

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

       old_name,        // ім'я користувача

   0,               //     0,               // змінюємо ім'я користувача

   (    (LPBYTE)&ui,     // адреса інформації про користувача

       NULL);           // немає індексації

 //   // перевіряємо на успішне завершення

   if (ret_status != NERR_Success)

   {

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

       printf("Net API Status : %d\n", ret_status);

       return ret_status;

   }

   printf("User name is changed.\n");

   USER_INFO_1  *uix;         // інформація про користувача

 //   // отримуємо інформацію про користувача

   ret_status = NetUserGetInfo(

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

       new_name,        // ім'я користувача

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

   (    (LPBYTE*)&uix);  // адреса інформації про користувача

 //   // перевіряємо на успішне завершення

   if (ret_status != NERR_Success)

   {

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

       return ret_status;

   }

 

   wprintf(L" User name: %s\n", uix ->usri1_name);

   wprintf(L" User commemnt: %s\n", uix ->usri1_comment);

   return 0;

}

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

  1.  Набрати та відлагодити всі наведені в теоретичних відомостях лістинги.
  2.  Скориставшись програмою з лабораторної роботи №2 створити користувачів User1, User 2  User10. Написати програму яка буде визначати до яких груп вони належать. Вказати окремоінформацію про належність до локальних груп.
  3.  Написати програму зміни інформації про характеристики створених користувачів User1, User 2  User10 з можливістю діалогового режиму зміни.




1. Контрольная работа- Психолого-педагогический консилиум, проведение консилиума в ДОУ
2. тематиз Основные подходы к исследованию международных конфликтов
3. Понятие и система предпринимательского права
4. Вступление Сварка ~ технологический процесс получения неразъемных соединений материалов посредс
5. технологический колледж.html
6. реферату- Що вивчає астрономія
7. Содержание и значение плана по труду.html
8. . Учебник подготовлен в соответствии с новой программой по психологии рассчитанной на 250 аудиторных часов
9. Тема Загальні питання методики План Предмет завдання і специфіка методики навчання української мови
10. Обойдут лисицу узнают ее лежку и по кустам на версту на две вокруг спящей развесят веревку с кумачовыми фл