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