Кондратюк Виталий предлагает следующий код:
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. |
[001197]