Получить список пользователей, подключённых к сети
Корпорации IBM срочно требуется ламер для организации и проведения увеселительных мероприятий.
unit NetUtils;
interfaceuses
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-}implementationuses 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 thenraise Exception(Res);
Count := $FFFFFFFF; {требуем выдать столько записей в список, сколько есть}
Res := WNetEnumResource(lphEnum, Count, Buf, BufSize);
{в буфере Buf - списочек в виде массива указателей на структуры
типа TNetResourceArr, а в Count - число этих структур}if Res = ERROR_NO_MORE_ITEMS then
Exit;
if (Res <> 0) thenraise Exception(Res);
P := PNetResourceArr(Buf);
for I := 0 to Count - 1 dobegin// Требуется копирование из буфера, так как он// действителен только до следующего вызова функций группы 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 thenraise Exception(Res);
Result:=NetWorkList;
finally
FreeMem(Buf);
end;
end;
end.
Статья Получить список пользователей, подключённых к сети раздела Интернет и Сети Сеть может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.