Перечислить зарегистрированных пользователей для удаленной или локальной NT системыDelphi , ОС и Железо , КомпьютерПеречислить зарегистрированных пользователей для удаленной или локальной NT системы
Оформил: DeeCo {-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unit Name: GetUser Author: Manfred Ruzicka History: Diese unit ermittelt den aktuell angemeldeten User einer NT / 2000 Worstation / Servers.Sie wurde aus dem Programm "loggedon2" von Assarbad ubernommen und fur an die VCL angepasst.Diese unit enthalt zwar noch einige kleine Fehler, funktioniert aber ohne Probleme.- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} 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. Программа на Delphi, которая извлекает список зарегистрированных пользователей на системе Windows NT/2000. Программа использует Windows API и функции регистрации для перебора пользователей. Обзор работы программы:
Программа использует несколько функций из Windows API, включая:
Программа также использует несколько переменных для хранения результатов перебора, включая:
Программа является quite сложной, с множеством переменных и функций. Она, вероятно, была написана разработчиком, который хотел предоставить простой способ перебора пользователей на системе Windows NT/2000. Некоторые предложения по улучшению кода:
В целом, это сложная программа, которая требует хорошего понимания Windows API и функций регистрации для работы эффективно. Получить список зарегистрированных пользователей для удаленной или локальной NT-системы. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |