GetLocalUserList - возвращает список пользователей (Windows NT, Windows 2000)
Code: |
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. |
Автор: Кондратюк Виталий
Этот блок определяет имя текущего Пользователя NT / 2000 Рабочей Станции / Сервера. Он взят из программы "loggedon2" Assarbad
и настроен для VCL. Этот блок содержит хотя еще некоторые небольшие ошибки, но работает без проблем.
Code: |
{-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unit Name: GetUser Author: Manfred Ruzicka - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} unit GetUser;
interface
uses Windows , Messages , SysUtils , Dialogs;
type TServerBrowseDialogA0 = function(hwnd: HWND; pchBuffer: Pointer; cchBufSize: DWORD): bool; stdcall; ATStrings = array of string;
procedure Server(const ServerName: string); function ShowServerDialog(AHandle: THandle): string;
implementation
uses Client, ClientSkin;
procedure Server(const ServerName: string); const MAX_NAME_STRING = 1024; var userName, domainName: array[0..MAX_NAME_STRING] of Char; subKeyName: array[0..MAX_PATH] of Char; NIL_HANDLE: Integer absolute 0; Result: ATStrings; subKeyNameSize: DWORD; Index: DWORD; userNameSize: DWORD; domainNameSize: DWORD; lastWriteTime: FILETIME; usersKey: HKEY; sid: PSID; sidType: SID_NAME_USE; authority: SID_IDENTIFIER_AUTHORITY; subAuthorityCount: BYTE; authorityVal: DWORD; revision: DWORD; subAuthorityVal: array[0..7] of DWORD;
function getvals(s: string): Integer; var i, j, k, l: integer; tmp: string; begin Delete(s, 1, 2); j := Pos('-', s); tmp := Copy(s, 1, j - 1); val(tmp, revision, k); Delete(s, 1, j); j := Pos('-', s); tmp := Copy(s, 1, j - 1); val('$' + tmp, authorityVal, k); Delete(s, 1, j); i := 2; s := s + '-'; for l := 0 to 7 do begin j := Pos('-', s); if j > 0 then begin tmp := Copy(s, 1, j - 1); val(tmp, subAuthorityVal[l], k); Delete(s, 1, j); Inc(i); end else break; end; Result := i; end; begin setlength(Result, 0); revision := 0; authorityVal := 0; FillChar(subAuthorityVal, SizeOf(subAuthorityVal), #0); FillChar(userName, SizeOf(userName), #0); FillChar(domainName, SizeOf(domainName), #0); FillChar(subKeyName, SizeOf(subKeyName), #0); if ServerName <> '' then begin usersKey := 0; if (RegConnectRegistry(PChar(ServerName), HKEY_USERS, usersKey) <> 0) then Exit; end else begin if (RegOpenKey(HKEY_USERS, nil, usersKey) <> ERROR_SUCCESS) then Exit; end; Index := 0; subKeyNameSize := SizeOf(subKeyName); while (RegEnumKeyEx(usersKey, Index, subKeyName, subKeyNameSize, nil, nil, nil, @lastWriteTime) = ERROR_SUCCESS) do begin if (lstrcmpi(subKeyName, '.default') <> 0) and (Pos('Classes', string(subKeyName)) = 0) then begin subAuthorityCount := getvals(subKeyName); if (subAuthorityCount >= 3) then begin subAuthorityCount := subAuthorityCount - 2; if (subAuthorityCount < 2) then subAuthorityCount := 2; authority.Value[5] := PByte(@authorityVal)^; authority.Value[4] := PByte(DWORD(@authorityVal) + 1)^; authority.Value[3] := PByte(DWORD(@authorityVal) + 2)^; authority.Value[2] := PByte(DWORD(@authorityVal) + 3)^; authority.Value[1] := 0; authority.Value[0] := 0; sid := nil; userNameSize := MAX_NAME_STRING; domainNameSize := MAX_NAME_STRING; if AllocateAndInitializeSid(authority, subAuthorityCount, subAuthorityVal[0], subAuthorityVal[1], subAuthorityVal[2], subAuthorityVal[3], subAuthorityVal[4], subAuthorityVal[5], subAuthorityVal[6], subAuthorityVal[7], sid) then begin if LookupAccountSid(PChar(ServerName), sid, userName, userNameSize, domainName, domainNameSize, sidType) then begin setlength(Result, Length(Result) + 1); Result[Length(Result) - 1] := string(domainName) + '\' + string(userName);
// Hier kann das Ziel eingetragen werden Form1.label2.Caption := string(userName); form2.label1.Caption := string(userName); end; end; if Assigned(sid) then FreeSid(sid); end; end; subKeyNameSize := SizeOf(subKeyName); Inc(Index); end; RegCloseKey(usersKey); end;
function ShowServerDialog(AHandle: THandle): string; var ServerBrowseDialogA0: TServerBrowseDialogA0; LANMAN_DLL: DWORD; buffer: array[0..1024] of char; bLoadLib: Boolean; begin bLoadLib := False; LANMAN_DLL := GetModuleHandle('NTLANMAN.DLL'); if LANMAN_DLL = 0 then begin LANMAN_DLL := LoadLibrary('NTLANMAN.DLL'); bLoadLib := True; end; if LANMAN_DLL <> 0 then begin @ServerBrowseDialogA0 := GetProcAddress(LANMAN_DLL, 'ServerBrowseDialogA0'); DialogBox(HInstance, MAKEINTRESOURCE(101), AHandle, nil); ServerBrowseDialogA0(AHandle, @buffer, 1024); if buffer[0] = '\' then begin Result := buffer; end; if bLoadLib = True then FreeLibrary(LANMAN_DLL); end; end;
end. |
Code: |
// 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; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!