Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Вывести информацию о пользователях, подключенных к рабочей станции

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

type
   THostInfo = record
     username: PWideChar;
     logon_domain: PWideChar;
     other_domains: PWideChar;
     logon_server: PWideChar;
   end;

   WKSTA_USER_INFO_0 = packed record
     wkui0_username: PWideChar;
   end;
   PWKSTA_USER_INFO_0 = ^WKSTA_USER_INFO_0;

 implementation

 {$R *.dfm}

 function NetWkstaUserEnum(servername: PWideChar;
   // Pointer to a string that specifies the DNS or NetBIOS name of the 
  // remote server on which the function is to execute. 
  // If this parameter is nil, the local computer is used. 
  level: DWORD;
   // Level = 0 : Return the names of users currently logged on to the workstation. 
  var bufptr: Pointer;   // Pointer to the buffer that receives the data 
  prefmaxlen: DWORD;
   // Specifies the preferred maximum length of returned data, in bytes. 
  var entriesread: PDWord;
   // Pointer to a value that receives the count of elements actually enumerated. 
  var totalentries: PDWord;  // total number of entries 
  var resumehandle: PDWord)
   // contains a resume handle which is used to continue an existing search 
  : Longint;
   stdcall; external 'netapi32.dll' Name 'NetWkstaUserEnum';


 function EnumNetUsers(HostName: WideString {; Users: TStrings}): THostInfo;
 const
   STR_ERROR_ACCESS_DENIED = 'The user does not have access to the requested information.';
   STR_ERROR_MORE_DATA = 'Specify a large enough buffer to receive all entries.';
   STR_ERROR_INVALID_LEVEL = 'The level parameter is invalid.';
 var
   Info: Pointer;
   ElTotal: PDWord;
   ElCount: PDWord;
   Resume: PDWord;
   Error: Longint;
   // UI : PWKSTA_USER_INFO_0; 
  // i : Integer; 
begin
   Resume := 0;
   NetWkstaUserEnum(PWideChar(HostName),
     1,
     Info,
     0,
     ElCount,
     ElTotal,
     Resume);

   Error := NetWkstaUserEnum(PWideChar(HostName),
     1,
     Info,
     256 * Integer(ElTotal),
     ElCount,
     ElTotal,
     Resume);

   case Error of
     ERROR_ACCESS_DENIED: Result.UserName := STR_ERROR_ACCESS_DENIED;
     ERROR_MORE_DATA: Result.UserName     := STR_ERROR_MORE_DATA;
     ERROR_INVALID_LEVEL: Result.UserName := STR_ERROR_INVALID_LEVEL
       else
         if Info <> nil then
         begin
           Result := THostInfo(info^);
     { 
    To retrieve all users: 
    UI := PWKSTA_USER_INFO_0(Info); 
    for i := 1 to DWord(ElCount) do 
    begin 
      Users.Add(UI^.wkui0_username); 
      inc(UI); 
    end; 
    }
         end
         else
           begin
             Result.UserName      := 'N/A';
             Result.logon_domain  := 'N/A';
             Result.other_domains := 'N/A';
             Result.logon_server  := 'N/A';
           end;
   end;
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   HostInfo: THostInfo;
 begin
   // Specify target machine as argument (with or without preceding \\) 
  HostInfo := EnumNetUsers('WORKSTATION');
   with HostInfo do
   begin
     Memo1.Lines.Add(username + #13#10+
      logon_domain + #13#10+
      other_domains + #13#10+
      logon_server);
   end;
 end;
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay