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

Материал из DRKB


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;

{ возвращает список сетевых имён с подуровня ListRoot, каждый
элемент списка TList - это PNetRec, где поле RemoteName определяет
соответственно сетевое имя элемента списка. Если ListRoot=nil, то
возвращается самый верхний уровень типа:
1. Microsoft Windows Network
2. Novell Netware Network
Чтобы получить список доменов сети Microsoft, нужно вызвать эту
функцию второй раз, передав ей в качестве параметра,
соответствующий элемент списка, полученного при первом её вызове.
Чтобы получить список компьютеров домена - вызвать третий раз... }
function GetContainerList(ListRoot: PNetResource): TList;
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.


Source: http://delphiworld.narod.ru
ID: 03312