
3. Отримання списку зареєстрованих користувачів
Для того, щоб перерахувати облікові записи всіх користувачів, зареєстрованих на сервері, використовується функція NetuserEnum, яка має наступний прототип:
NET_API_STATUS NetuserEnum(
LPCWSTR servername, // ім'я сервера
DWORD level, // рівень інформації
DWORD filter, // фільтр на облікові записи
LPBYTE *bufptr, // покажчик на буфер з інформацією
DWORD prefmaxlen, // довжина буфера з інформацією
LPDWORD entriesread, // кількість прочитаних структур
LPDWORD totalentries, // загальна кількість структур
LPDWORD resume_handle // дескриптор для продовження читання
);
У разі успішного завершення функція NetuserEnum повертає значення NERR_success, а у разі невдачі можливі наступні коди завершення:
error_access_denied — користувачеві відмовлено в доступі;
NERR_invaiidcomputer — неправильне ім'я комп'ютера;
error_more_data — не всі дані прочитані.
Параметри функції NetuserEnum мають наступне призначення.
Параметр servername повинен указувати на рядок з ім'ям сервера, на якому виконуватиметься функція. Цей рядок повинен мати кодування Unicode і починатися з символів \\. Якщо функція повинна виконуватися на локальному комп'ютері, то цей параметр повинен мати значення null.
У лістингу 3 приведена програма, яка перераховує облікові записи користувачів, використовуючи функцію NetUserEnum.
Лістинг 3. Перерахування облікових записів користувачів
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment( lib, "netapi32.lib" ) // підключаємо мережеву бібліотеку
int main()
{
wchar_t server_name[256] = L"\\\\"; // ім'я сервера
USER_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));
// отримуємо інформацію про користувачів
ret_status = NetUserEnum(
server_name, // ім'я сервера
0, // дізнаємося тільки імена користувачів
FILTER_NORMAL_ACCOUNT, // перераховуємо користувачів, зареєстрованих на комп'ютері
(LPBYTE*)&ui, // адреса інформації про користувачів
MAX_PREFERRED_LENGTH, // перераховуємо всіх користувачів
&entries_read, // кількість прочитаних користувачів
&total_entries, // загальна кількість користувачів
NULL); // індексації немає
// перевіряємо на успішне завершення
if (ret_status != NERR_Success)
{
printf("Net user get info 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"User name: %s\n", ui[i].usri0_name);
NetApiBufferFree(ui); // вивільняємо буфер
return 0;
}