Получить список пользователей, подключенных к сети
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