2. Отримання інформації про користувача
Для отримання інформації про користувача з його облікового запису використовується функція NetuserGetinfo, яка має наступний прототип:
NET_API_STATUS NetUserGetlnfо(
LPCWSTR servername, // ім’я сервера
LPCWSTR username, // ім’я користувача
DWORD level, // рівень інформації
LPBYTE *bufptr // вказівник на інформацію
);
У разі успішного завершення функція NetuserGetinfo повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
error_access_denied — користувачеві відмовлено в доступі;
NERR_invaiidcomputer — неправильне ім'я комп'ютера;
NERR_userNotFound — користувач не знайдений.
Параметри функції NetuserGetinfo мають наступне призначення.
Параметр servername повинен вказувати на рядок з ім'ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп'ютері, то цей параметр повинен мати значення null.
Параметр username повинен вказувати на рядок з ім'ям користувача, інформацію про яке повертає функція. Цей рядок повинен мати кодування Unicode.
Параметр level указує тип структури, в яку буде записана інформація про користувача. Цей параметр може приймати одне з наступних значень:
1 — використовується структура типу user_info_i;
2 — використовується структура типу user_info_2;
3 — використовується структура типу user_info_3;
4 — використовується структура типу user_info_4;
10 — використовується структура типу user_info_io;
11 — використовується структура типу user_info_h;
20 — використовується структура типу user_info_2o;
23 — використовується структура типу user_info_23.
Параметр bufptr повинен містити адресу покажчика на масив байтів. У цей покажчик функція запише адресу буфера з інформацією про користувача.
Пам'ять під буфер виділяє система. Тому після прочитання інформації про користувача з буфера ця пам'ять повинна бути звільнена за допомогою виклику функції NetApiBufferFree, яка розглянута далі.
Для звільнення пам'яті, яка резервується функціями з бібліотеки netapi32.1ib, використовується функція NetApiBufferFree, яка має наступний прототип:
NET_API_STATUS NetApiBuf ferFree (
LPVOID buffer // вказівник на буфер
);
У разі успішного завершення функція NetApiBufferFree повертає значення NERR_success, а у разі невдачі код помилки. Єдиний параметр цієї функції повинен указувати на буфер, пам'ять для якого була заздалегідь розподілена одній з мережевих функцій.
У лістингу 2 приведена програма, яка отримує інформацію про користувача за допомогою функції NetUserGetlnfо.
Лістинг 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 user_name[UNLEN]; // ім’я користувача
USER_INFO_1 *ui; // інформація про користувача
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 = NetUserGetInfo(
server_name, // ім’я сервера
user_name, // ім’я користувача
1, // рівень інформації 1
(LPBYTE*)&ui); // адреса інформації про користувача
// перевіряємо на успішне завершення
if (ret_status != NERR_Success)
{
printf("Net user get info failed.\n");
return ret_status;
}
wprintf(L"User name: %s\n", ui->usri1_name);
wprintf(L"User commemnt: %s\n", ui->usri1_comment);
NetApiBufferFree(ui); // вивільняємо буфер
return 0;
}
