Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007
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.

Взято с https://delphiworld.narod.ru