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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Для перерахування глобальних груп, яким належить користувач, використовується функція NetuserGetGroups, яка має наступний прототип, :
NET_API_STATUS NetuserGetGroups(
LPCWSTR servername, // ім'я сервера
LPCWSTR username, // ім'я користувача
DWORD level, // рівень інформації
LPBYTE *bufptr, // адреса покажчика на буфер з інформацією
DWORD prefmaxlen, // довжина буфера з інформацією
LPDWORD entriesread, // кількість прочитаних структур
LPDWORD totalentries // загальна кількість структур
);
У разі успішного завершення функція NetuserGetGroups повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення :
Параметри функції 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;
}
Для перерахування локальних груп, яким належить користувач, використовується функція 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;
}
Для зміни вмісту облікового запису користувача використовується функція Netusersetinf о, яка має наступний прототип:
NET_API_STATUS NetUserSetlnfо(
LPCWSTR servername, // ім'я сервера
LPCWSTR username, // ім'я користувача
DWORD level, // рівень інформації
LPBYTE buf, // буфер з інформацією про обліковий запис
LPDWORD parm_err // індекс поля з неправильними даними
);
Відмітимо, що успішно цю функцію можуть виконати тільки користувачі, які є адміністраторами або операторами облікових записів.
У разі успішного завершення функція Netusersetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
Параметр 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;
}