скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Перечислить зарегистрированных пользователей для удаленной или локальной 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.





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook