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

Получить список пользователей, подключённых к сети

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

Получить список пользователей, подключённых к сети


Корпорации IBM срочно требуется ламер для организации и проведения увеселительных мероприятий.


unit NetUtils;

interface

uses
  Windows, Classes;

function GetContainerList(ListRoot:PNetResource):TList;

type
  {$H+}
  PNetRes = ^TNetRes;
  TNetRes = record
    dwScope : Integer;
    dwType : Integer;
    dwDisplayType : Integer;
    dwUsage : Integer;
    LocalName : string;
    RemoteName : string;
    Comment : string;
    Provider : string;
  end;
  {H-}


implementation

uses SysUtils;

type
  PnetResourceArr = ^TNetResource;

function GetContainerList(ListRoot:PNetResource):TList;
{возвращает список сетевых имён с подуровня ListRoot, каждый
элемент списка TList - это PNetRec, где поле RemoteName определяет
соответственно сетевое имя элемента списка. Если ListRoot=nil, то
возвращается самый верхний уровень типа:
1. Microsoft Windows Network
2. Novell Netware Network
Чтобы получить список доменов сети Microsoft, нужно вызвать эту
функцию второй раз, передав ей в качестве параметра,
соответствующий элемент списка, полученного при первом её вызове.
Чтобы получить список компьютеров домена - вызвать третий раз...}
var
  TempRec : PNetRes;
  Buf : Pointer;
  Count,
  BufSize,
  Res : DWORD;
  lphEnum : THandle;
  p : PNetResourceArr;
  i : SmallInt;
  NetworkList : TList;
begin
  NetworkList := TList.Create;
  Result:=nil;
  BufSize := 8192;
  GetMem(Buf, BufSize);
  try
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER{0}, ListRoot,lphEnum);
    {в результате получаем ссылку lphEnum}
    if Res <> 0 then
      raise Exception(Res);
    Count := $FFFFFFFF; {требуем выдать столько записей в список, сколько есть}
    Res := WNetEnumResource(lphEnum, Count, Buf, BufSize);
    {в буфере Buf - списочек в виде массива указателей на структуры
    типа TNetResourceArr, а в Count - число этих структур}
    if Res = ERROR_NO_MORE_ITEMS then
      Exit;
    if (Res <> 0) then
      raise Exception(Res);
    P := PNetResourceArr(Buf);
    for I := 0 to Count - 1 do
    begin
      // Требуется копирование из буфера, так как он
      // действителен только до следующего вызова функций группы WNet
      New(TempRec);
      TempRec^.dwScope := P^.dwScope;
      TempRec^.dwType := P^.dwType ;
      TempRec^.dwDisplayType := P^.dwDisplayType ;
      TempRec^.dwUsage := P^.dwUsage ;
      {имеются ввиду вот эти указатели}
      TempRec^.LocalName := StrPas(P^.lpLocalName);
      {в смысле - строки PChar}
      TempRec^.RemoteName := StrPas(P^.lpRemoteName);
      TempRec^.Comment := StrPas(P^.lpComment);
      TempRec^.Provider := StrPas(P^.lpProvider);
      NetworkList.Add(TempRec);
      Inc(P);
    end;
    Res := WNetCloseEnum(lphEnum);
    {а следующий вызов - вот он!}
    if Res <> 0 then
      raise Exception(Res);
    Result:=NetWorkList;
  finally
    FreeMem(Buf);
  end;
end;

end.

Программный код на Delphi, который предоставляет функцию GetContainerList для получения списка пользователей сети, подключенных к системе. Функция принимает параметр PNetResource, представляющий корень контейнера сети.

Разбивка кода:

  1. Функция GetContainerList объявлена с типом возвращаемого значения TList, который будет содержать список пользователей сети.
  2. Функция создает пустой список NetworkList.
  3. Затем она выделяет память для буфера (Buf) и инициализирует его 8192 байтами.
  4. Функция вызывает WNetOpenEnum с типом ресурса RESOURCE_GLOBALNET, типом ресурса RESOURCETYPE_ DISK, флагами использования ресурса RESOURCEUSAGE_CONTAINER и параметром ListRoot. Это открывает перечисление ресурсов сети, начиная от корня, указанного в параметре ListRoot.
  5. Функция проверяет успешность вызова WNetOpenEnum и выбрасывает исключение, если это не так.
  6. Затем она вызывает WNetEnumResource с параметрами lphEnum (номер перечисления) и Buf (буфер). Это заполняет буфер списком ресурсов сети.
  7. Функция проверяет успешность вызова WNetEnumResource и выбрасывает исключение, если это не так.
  8. Затем она проходит по списку ресурсов в буфере, создает новый рекорд PNetRes для каждого ресурса и добавляет его в список NetworkList.
  9. Наконец, функция закрывает номер перечисления с помощью WNetCloseEnum и возвращает список NetworkList.

Обратите внимание, что этот код использует функции Windows API WNetOpenEnum, WNetEnumResource и WNetCloseEnum для выполнения перечисления ресурсов.

Для использования этой функции вы бы вызвали ее с валидным параметром PNetResource, например, корнем Microsoft Windows Network или Novell Netware Network. Функция вернет список пользователей сети, подключенных к системе.

Пример использования:

var
  ListRoot: PNetResource;
  UserList: TList;

// Получение корня Microsoft Windows Network
ListRoot := WNetGetDefaultConnection(RESOURCE_ GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER);

// Вызов функции GetContainerList
UserList := GetContainerList(ListRoot);

// Перебор списка пользователей
for i := 0 to UserList.Count - 1 do
begin
  writeln(UserList[i].RemoteName);
end;

Это бы напечатало список пользователей сети, подключенных к системе.

Функция GetContainerList возвращает список пользователей, подключенных к сети, на основе параметра ListRoot.


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

Получайте свежие новости и обновления по 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 03:10:13/0.0036659240722656/0