Получить список пользователей, подключённых к сети
Корпорации 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, который предоставляет функцию GetContainerList для получения списка пользователей сети, подключенных к системе. Функция принимает параметр PNetResource, представляющий корень контейнера сети.
Разбивка кода:
Функция GetContainerList объявлена с типом возвращаемого значения TList, который будет содержать список пользователей сети.
Функция создает пустой список NetworkList.
Затем она выделяет память для буфера (Buf) и инициализирует его 8192 байтами.
Функция вызывает WNetOpenEnum с типом ресурса RESOURCE_GLOBALNET, типом ресурса RESOURCETYPE_ DISK, флагами использования ресурса RESOURCEUSAGE_CONTAINER и параметром ListRoot. Это открывает перечисление ресурсов сети, начиная от корня, указанного в параметре ListRoot.
Функция проверяет успешность вызова WNetOpenEnum и выбрасывает исключение, если это не так.
Затем она вызывает WNetEnumResource с параметрами lphEnum (номер перечисления) и Buf (буфер). Это заполняет буфер списком ресурсов сети.
Функция проверяет успешность вызова WNetEnumResource и выбрасывает исключение, если это не так.
Затем она проходит по списку ресурсов в буфере, создает новый рекорд PNetRes для каждого ресурса и добавляет его в список NetworkList.
Наконец, функция закрывает номер перечисления с помощью WNetCloseEnum и возвращает список NetworkList.
Обратите внимание, что этот код использует функции Windows API WNetOpenEnum, WNetEnumResource и WNetCloseEnum для выполнения перечисления ресурсов.
Для использования этой функции вы бы вызвали ее с валидным параметром PNetResource, например, корнем Microsoft Windows Network или Novell Netware Network. Функция вернет список пользователей сети, подключенных к системе.
Пример использования:
varListRoot:PNetResource;UserList:TList;// Получение корня Microsoft Windows NetworkListRoot:=WNetGetDefaultConnection(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER);// Вызов функции GetContainerListUserList:=GetContainerList(ListRoot);// Перебор списка пользователейfori:=0toUserList.Count-1dobeginwriteln(UserList[i].RemoteName);end;
Это бы напечатало список пользователей сети, подключенных к системе.
Функция GetContainerList возвращает список пользователей, подключенных к сети, на основе параметра ListRoot.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.