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

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.


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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...