Список пользователей в Windows NT/2000

Решение:

unit Func;

interface

uses
  SysUtils, Classes, StdCtrls, ComCtrls, Graphics, Windows;

{$EXTERNALSYM NetUserEnum}
function NetUserEnum(servername: LPWSTR; level, filter: DWORD; bufptr: Pointer;
      prefmaxlen: DWORD; entriesread, totalentries, resume_handle: LPDWORD): DWORD;
      stdcall; external 'NetApi32.dll' Name 'NetUserEnum';
function NetApiBufferFree(Buffer: Pointer{LPVOID}): DWORD; stdcall;
      external 'NetApi32.dll' Name 'NetApiBufferFree';
procedure GetLocalUserList(ulist: TStringList);

implementation

// возвращает список пользователей локального хоста
procedure GetLocalUserList(ulist: TStringList);
const
  NERR_SUCCESS = 0;
  FILTER_TEMP_DUPLICATE_ACCOUNT = $0001;
  FILTER_NORMAL_ACCOUNT = $0002;
  FILTER_PROXY_ACCOUNT = $0004;
  FILTER_INTERDOMAIN_TRUST_ACCOUNT = $0008;
  FILTER_WORKSTATION_TRUST_ACCOUNT = $0010;
  FILTER_SERVER_TRUST_ACCOUNT = $0020;

type
  TUSER_INFO_10 = record
      usri10_name,
      usri10_comment,
      usri10_usr_comment,
      usri10_full_name: PWideChar;
  end;

  PUSER_INFO_10 = ^TUSER_INFO_10;

var
  dwERead, dwETotal, dwRes, res: DWORD;
  inf: PUSER_INFO_10;
  info: Pointer;
  p: PChar;
  i: Integer;
begin
  if ulist = nil then Exit;
  ulist.Clear;
  info := nil;
  dwRes := 0;
  res := NetUserEnum(nil, 10, FILTER_NORMAL_ACCOUNT, @info, 65536, @dwERead,
                     @dwETotal, @dwRes);
  if (res <> NERR_SUCCESS) or (info = nil) then Exit;
  p := PChar(info);
  for i:=0 to dwERead - 1 do begin
    inf := PUSER_INFO_10(p + i * SizeOf(TUSER_INFO_10));
    ulist.Add(WideCharToString(PWideChar((inf^).usri10_name)));
  end;
  NetApiBufferFree(info);
end;

end.
[Кондратюк Виталий]