Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить список зарегистрированных под NT пользователей

Delphi , ОС и Железо , Компьютер

Получить список зарегистрированных под NT пользователей

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// The NetUserEnum function provides information about all user accounts on a server. 

type
   USER_INFO_1 = record
     usri1_name: LPWSTR;
     usri1_password: LPWSTR;
     usri1_password_age: DWORD;
     usri1_priv: DWORD;
     usri1_home_dir: LPWSTR;
     usri1_comment: LPWSTR;
     usri1_flags: DWORD;
     usri1_script_path: LPWSTR;
   end;
   lpUSER_INFO_1 = ^USER_INFO_1;

 function NetUserEnum(ServerName: PWideChar;
   Level,
   Filter: DWORD;
   var Buffer: Pointer;
   PrefMaxLen: DWORD;
   var EntriesRead,
   TotalEntries,
   ResumeHandle: DWORD): Longword; stdcall; external 'netapi32.dll';

 function NetApiBufferFree(pBuffer: PByte): Longint; stdcall; external
 'netapi32.dll';

 {...}

 procedure TForm1.Button1Click(Sender: TObject);
 var
   EntiesRead: DWORD;
   TotalEntries: DWORD;
   UserInfo: lpUSER_INFO_1;
   lpBuffer: Pointer;
   ResumeHandle: DWORD;
   Counter: Integer;
   NetApiStatus: LongWord;
 begin
   ResumeHandle := 0;
   repeat
     // NetApiStatus := 
    // NetUserEnum(PChar('\\NT-Domain'), 1, 0, lpBuffer, 0,EntiesRead, TotalEntries, ResumeHandle); 
    NetApiStatus := NetUserEnum(nil, 1, 0, lpBuffer, 0, EntiesRead,
       TotalEntries, ResumeHandle);
     UserInfo     := lpBuffer;

     for Counter := 0 to EntiesRead - 1 do
     begin
       listbox1.Items.Add(WideCharToString(UserInfo^.usri1_name) + ' --> ' +
         WideCharToString(UserInfo^.usri1_comment));
       Inc(UserInfo);
     end;

     NetApiBufferFree(lpBuffer);
   until (NetApiStatus <> ERROR_MORE_DATA);
 end;

Перевод контента на русский язык:

В предоставленном коде Delphi, функция NetUserEnum используется для перебора всех пользовательских аккаунтов на указанном сервере NT-Domain.

Разбивка кода:

  1. Определены два типа: USER_INFO_1 и lpUSER_INFO_1. Первый представляет запись, содержащую различные детали о пользовательском аккаунте (имя, возраст пароля, привилегии, домашняя папка, комментарий, флаги, путь к скрипту), а второй - указатель на эту запись.

  2. Функция NetUserEnum вызывается повторно для получения всех пользовательских аккаунтов на сервере. Она принимает несколько параметров:

  3. ServerName: имя сервера (в этом случае установлено в '\\NT-Domain').
  4. Level: уровень информации, запрошенной.
  5. Filter: значение фильтра для фильтрации пользователей.
  6. Buffer: буфер, в котором функция возвращает информацию о пользователях.
  7. PrefMaxLen: предпочтительный максимальный размер имени пользователя.
  8. EntriesRead, TotalEntries и ResumeHandle: параметры, обновляемые функцией.

  9. Внутри цикла процессирования каждого пользовательского аккаунта, полученного с сервера:

  10. Добавляется имя и комментарий пользователя в список (listbox1).
  11. Увеличивается указатель на следующую запись в буфере.

  12. После обработки всех пользователей для этой итерации, буфер освобождается с помощью NetApiBufferFree.

  13. Цикл продолжается до тех пор, пока не будут получены все пользовательские аккаунты или не произойдет ошибки.

Альтернативное решение без использования типа lpUSER_INFO_1:

procedure TForm1.Button1Click(Sender: TObject);
var
  EntiesRead, TotalEntries: DWORD;
  Buffer: Pointer;
  ResumeHandle: DWORD;
  Counter: Integer;
  NetApiStatus: LongWord;
begin
  ResumeHandle := 0;

  repeat
    NetApiStatus := NetUserEnum(nil, 1, 0, Buffer, 0, EntiesRead, TotalEntries, ResumeHandle);
    if NetApiStatus = ERROR_MORE_DATA then
      exit; // Exit the loop

    for Counter := 0 to EntiesRead - 1 do
    begin
      listbox1.Items.Add(WideCharToString(Buffer + (Counter * SizeOf(USER_INFO_1))^usri1_name) + ' --> ' +
        WideCharToString(Buffer + (Counter * SizeOf(USER_INFO_1))^usri1_comment));
    end;

    NetApiBufferFree(Buffer);
  until False;
end;

В этом альтернативном решении мы используем функцию SizeOf(USER_INFO_1) для расчета размера каждой записи в буфере и затем доступ к необходимым полям с помощью арифметики указателей. Это позволяет избежать необходимости отдельного объявления типа для записи о пользовательском аккаунте.

В статье описывается способ получения списка зарегистрированных пользователей на сервере с использованием функции NetUserEnum из библиотеки netapi32.dll и языка программирования Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компьютер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-02 19:56:50/0.0038619041442871/0