Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Вывести информацию о пользователях, подключенных к рабочей станции

Delphi , Интернет и Сети , Сеть

Вывести информацию о пользователях, подключенных к рабочей станции

Оформил: 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, использующая функцию Windows NetWkstaUserEnum для получения информации о пользователях, которые в данный момент зарегистрированы на рабочем станции. Программа определяет две функции: NetWkstaUserEnum и EnumNetUsers.

Функция NetWkstaUserEnum - это внешняя функция, импортированная из библиотеки netapi32.dll. Она принимает несколько параметров:

  • servername: указатель на строку, содержащую DNS- или NetBIOS-имя удаленного сервера.
  • level: целочисленное значение,specifying уровень информации для получения (в этом случае 0 для пользователей, которые в данный момент зарегистрированы).
  • bufptr: указатель на буфер, который получает данные.
  • prefmaxlen: предпочтительный максимальный размер возвращаемых данных в байтах.
  • entriesread: указатель на значение, которое получает количество элементов, фактически перечисленных.
  • totalentries: указатель на значение, содержащее общее количество записей.
  • resumehandle: указатель на резюме-обработчик, используемый для продолжения существующего поиска.

Функция EnumNetUsers - это обёртка вокруг функции NetWkstaUserEnum. Она принимает два параметра: HostName (широкая строка) и Users (экземпляр TStrings). Функция вызывает NetWkstaUserEnum с указанным именем хоста, уровнем 0 и другими параметрами.

Функция возвращает запись THostInfo, содержащую информацию о пользователях, зарегистрированных на рабочей станции. Если при перечислении возникла ошибка, функция устанавливает переменную Result в строку, описывающую ошибку.

В обработчике события Button1Click программа вызывает EnumNetUsers с именем хоста 'WORKSTATION' и получает список пользователей, зарегистрированных на этом рабочем станции. Полученная информация затем отображается в текстовом поле (Memo1).

В предложениях улучшений и советах указаны следующие моменты:

  • Обработка ошибок: текущая реализация только обрабатывает три конкретные коды ошибки (отказ доступа, более данных, недопустимый уровень). Возможно, стоит добавить более robust обработку ошибок для обработки других возможных ошибок.
  • Размер буфера: функция NetWkstaUserEnum требует буфера достаточного размера для приема всех возвращаемых данных. В текущей реализации размер буфера жестко закодирован как 256 байт. Возможно, стоит сделать этот параметр настраиваемым или использовать более динамический подход к определению требуемого размера буфера.
  • Интерфейс пользователя: программа использует текстовое поле (Memo1) для отображения полученной информации. Возможно, стоит добавить таблицу или другой компонент UI для упрощения чтения и навигации списка пользователей.
  • Организация кода: функция EnumNetUsers является quite long и может быть разбита на более управляемые функции. Это улучшит читаемость и поддержку кода.

В альтернативном решении используется компонент Delphi TNetWkstaUserEnum:

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, Dialogs, Netapi32_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Users: TNetWkstaUserEnum;
begin
  Users := TNetWkstaUserEnum.Create(nil);
  try
    Users.HostName := 'WORKSTATION';
    Users.EnumUsers();
    Memo1.Lines.Clear;
    for i := 0 to Users.UserCount - 1 do
      Memo1.Lines.Add(Users.UserName(i));
  finally
    Users.Free;
  end;
end.

В этом решении используется компонент TNetWkstaUserEnum, который обёртывает сложность функции NetWkstaUserEnum. Программа создает экземпляр компонента, устанавливает имя хоста в 'WORKSTATION', а затем перечисляет пользователей, зарегистрированных на этом рабочем станции. Полученная информация отображается в текстовом поле (Memo1).

Описывается функция EnumNetUsers, которая выводит информацию о пользователях, подключенных к рабочей станции.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 06:00:16/0.002241849899292/0