Как в Windows2000 получить список пользователей?
{$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): DWORD; stdcall;
external 'NetApi32.dll' Name 'NetApiBufferFree';
var
Form1: TForm1;
UserList: TStringList;
// Процедура возвращает список пользователей // локального хоста (Windows NT, Windows 2000) procedure TForm1.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;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Memo1.Clear;
UserList := TStringList.Create;
GetLocalUserList( UserList );
for i := 0 to UserList.Count-1 do
Memo1.Lines.Add( UserList.Strings[i] );
UserList.Free;
end; |