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

Previous  Top  Next

    
 

 

 

Code:

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.

 

 

 

©Drkb::03312

       

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