Código Delphi
[-]
uses WinSock;
function EnumHosts(const lpWorkgroup: PChar = nil; const lpNetResource: PNetResource = nil; const Level: Cardinal = 0): TStrings;
var
hEnum, Buffer, Count, Size: Cardinal;
HostEntry: PHostEnt;
Item: PNetResource;
List: TStrings;
label TryAgain;
begin
Result := nil;
if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, lpNetResource, hEnum) = 0 then
begin
Size := 16 * 1024;
Count := $FFFFFFFF;
TryAgain: Buffer := LocalAlloc(LMEM_ZEROINIT, Size);
if WNetEnumResource(hEnum, Count, Ptr(buffer), Size) = ERROR_MORE_DATA then
begin
LocalFree(Buffer);
goto TryAgain;
end;
Item := Ptr(Buffer);
Result := TStringList.Create;
while LongBool(Count) do
begin
if Level < 2 then
begin
if (Level <> 1) or not Assigned(lpWorkgroup) or (lstrcmpi(lpWorkgroup, Item.lpRemoteName) = 0) then
begin
List := EnumHosts(lpWorkgroup, Item, Level + 1);
if Assigned(List) then
begin
Result.AddStrings(List);
List.Destroy;
end;
end;
end
else
begin
HostEntry := gethostbyname(@Item.lpRemoteName[2]); if Assigned(HostEntry) then
Result.Add(inet_ntoa(PInAddr(HostEntry.h_addr^)^))
else
Result.Add(Item.lpRemoteName);
end;
Dec(Count);
Inc(Item);
end;
LocalFree(Buffer);
WNetCloseEnum(hEnum);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var WSData: WSAData;
begin
WSAStartup($0101, WSData); end;
Uso:
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items := EnumHosts;
end;
ó
Código Delphi
[-]procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items := EnumHosts(Edit1.Text);
end;
ó
Código Delphi
[-]function NetWkstaGetInfo(server: PWideChar; level: Cardinal; buffer: Pointer): Cardinal; stdcall external 'netapi32';
type
TWkstaInfo100 = record
wki100_platform_id: Cardinal;
wki100_computername,
wki100_langroup: PWideChar;
wki100_ver_major,
wki100_ver_minor: Cardinal;
end;
procedure TForm1.Button2Click(Sender: TObject);
var Info: ^TWkstaInfo100;
begin
if (NetWkstaGetInfo(nil, 100, @Info) = 0) and Assigned(Info) then
begin
ListBox1.Items := EnumHosts(PChar(string(WideString(Info.wki100_langroup)))); LocalFree(Cardinal(Info)); end;
end;
Para prevenir MemoryLeak en lugar de asignación directa, considerar usar con:
Código Delphi
[-]function GetHostsList(Dest: TStrings; DesiredWorkgroup: string = ''): Boolean;
var List: TStrings;
begin
if DesiredWorkgroup = '' then
List := EnumHosts
else
List := EnumHosts(PChar(DesiredWorkgroup));
Result := Assigned(List);
if Result then
begin
Dest.Assign(List);
List.Destroy;
List.Free;
end;
end;
cHackAll