Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как найти все комьютеры в сети?

01.01.2007
unit FindComp; 
 
interface 
 
uses 
 Windows, Classes; 
 
function FindComputers: DWORD; 
 
var 
 Computers: TStringList; 
 
implementation 
 
uses 
 SysUtils; 
 
const 
 MaxEntries = 250; 
 
function FindComputers: DWORD; 
 
var 
 EnumWorkGroupHandle, EnumComputerHandle: THandle; 
 EnumError: DWORD; 
 Network: TNetResource; 
 WorkGroupEntries, ComputerEntries: DWORD; 
 EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource; 
 EnumBufferLength: DWORD; 
 I, J: DWORD; 
 
begin 
 
 Computers.Clear; 
 
 FillChar(Network, SizeOf(Network), 0); 
 with Network do 
 begin 
   dwScope := RESOURCE_GLOBALNET; 
   dwType := RESOURCETYPE_ANY; 
   dwUsage := RESOURCEUSAGE_CONTAINER; 
 end; 
 
 EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle); 
 
 if EnumError = NO_ERROR then 
 begin 
   WorkGroupEntries := MaxEntries; 
   EnumBufferLength := SizeOf(EnumWorkGroupBuffer); 
   EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength); 
 
   if EnumError = NO_ERROR then 
   begin 
     for I := 1 to WorkGroupEntries do 
     begin 
       EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle); 
       if EnumError = NO_ERROR then 
       begin 
         ComputerEntries := MaxEntries; 
         EnumBufferLength := SizeOf(EnumComputerBuffer); 
         EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength); 
         if EnumError = NO_ERROR then 
           for J := 1 to ComputerEntries do 
             Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2)); 
         WNetCloseEnum(EnumComputerHandle); 
       end; 
     end; 
   end; 
   WNetCloseEnum(EnumWorkGroupHandle); 
 end; 
 
 if EnumError = ERROR_NO_MORE_ITEMS then 
   EnumError := NO_ERROR; 
 Result := EnumError; 
 
end; 
 
initialization 
 
 Computers := TStringList.Create; 
 
finalization 
 
 Computers.Free; 
 
end.
©Drkb::03286

 


function TNetForm.FillNetLevel(xxx: PNetResource; List:TListItems): Word;
Type
    PNRArr = ^TNRArr;
    TNRArr = array[0..59] of TNetResource;
Var
   x: PNRArr;
   tnr: TNetResource;
   I : integer;
   EntrReq,
   SizeReq,
   twx: THandle;
   WSName: string;
   LI:TListItem;
begin
     Result :=WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER, xxx, twx);
     If Result = ERROR_NO_NETWORK Then Exit;
     if Result = NO_ERROR then
     begin
            New(x);
            EntrReq := 1;
            SizeReq := SizeOf(TNetResource)*59;
            while (twx <> 0) and
                  (WNetEnumResource(twx, EntrReq, x, SizeReq) <> ERROR_NO_MORE_ITEMS) do
            begin
                  For i := 0 To EntrReq - 1 do
                  begin
                   Move(x^[i], tnr, SizeOf(tnr));
                   case tnr.dwDisplayType of
                    RESOURCEDISPLAYTYPE_SERVER:
                    begin
                       if tnr.lpRemoteName <> '' then
                           WSName:= tnr.lpRemoteName
                           else WSName:= tnr.lpComment;
                       LI:=list.Add;
                       LI.Caption:=copy(WSName,3,length(WSName)-2);
                       //list.Add(WSName);
                    end;
                    else FillNetLevel(@tnr, list);
                   end;
                  end;
            end;
            Dispose(x);
            WNetCloseEnum(twx);
     end;
end;
 
Пример вызова: 
FillNetLevel(nil,ListView1.Items);
       ©Drkb::03287

Автор: Pegas

Взято с Vingrad.ru https://forum.vingrad.ru


function EnumerateFunc( hwnd: HWND; hdc: HDC; lpnr: PNetResource ): Boolean;
const
 cbBuffer : DWORD    = 16384;      // 16K is a good size
var
 hEnum, dwResult, dwResultEnum : DWORD;
 lpnrLocal : array
       [0..16384 div SizeOf(TNetResource)] of TNetResource;    // pointer to enumerated structures
 i : integer;
 cEntries : Longint;             
begin
 centries := -1;      // enumerate all possible entries
 
 // Call the WNetOpenEnum function to begin the enumeration.
 dwResult := WNetOpenEnum(
                         RESOURCE_CONTEXT,  // Enumerate currently connected resources.
                         RESOURCETYPE_DISK, // all resources
                         0,                 // enumerate all resources
                         lpnr,              // NULL first time the function is called
                         hEnum              // handle to the resource
                         );
 
 if (dwResult <> NO_ERROR) then
 begin
   // Process errors with an application-defined error handler
   Result := False;
   Exit;
 end;
 
 // Initialize the buffer.
 FillChar( lpnrLocal, cbBuffer, 0 );
 
 // Call the WNetEnumResource function to continue
 //  the enumeration.
 dwResultEnum := WNetEnumResource(hEnum,           // resource handle
                                 DWORD(cEntries),  // defined locally as -1
                                 @lpnrLocal,       // LPNETRESOURCE
                                 cbBuffer);        // buffer size
 
 // This is just printing
 for i := 0 to cEntries - 1 do
 begin
   // loop through each structure and 
   // get remote name of resource... lpnrLocal[i].lpRemoteName)
 end;
 
 // Call WNetCloseEnum to end the enumeration.
 dwResult := WNetCloseEnum(hEnum);
 
 if(dwResult <> NO_ERROR) then
 begin
   // Process errors... some user defined function here
   Result := False;
 end
 else
   Result :=  True;
end;

Код вроде бы из борландовского FAQ. На форуме приведен SmaLL

Взято с Vingrad.ru https://forum.vingrad.ru


Вот решение приведенное на https://delphi.mastak.ru для нахождения всех компютеров:

var
  Computer: array[1..500] of string[25];
  ComputerCount: Integer;
 
procedure FindAllComputers(Workgroup: string);
var
  EnumHandle: THandle;
  WorkgroupRS: TNetResource;
  Buf: array[1..500] of TNetResource;
  BufSize: Integer;
  Entries: Integer;
  Result: Integer;
begin
  ComputerCount := 0;
  Workgroup := Workgroup + #0;
  FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
  with WorkgroupRS do
    begin
      dwScope := 2;
      dwType := 3;
      dwDisplayType := 1;
      dwUsage := 2;
      lpRemoteName := @Workgroup[1];
    end;
  WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    0,
    @WorkgroupRS,
    EnumHandle);
  repeat
    Entries := 1;
    BufSize := SizeOf(Buf);
    Result :=
      WNetEnumResource(EnumHandle,
      Entries,
      @Buf,
      BufSize);
    if (Result = NO_ERROR) and (Entries = 1) then
      begin
        Inc(ComputerCount);
        Computer[ComputerCount] := StrPas(Buf[1].lpRemoteName);
      end;
  until (Entries <> 1) or (Result <> NO_ERROR);
  WNetCloseEnum(EnumHandle);
end; { Find All Computers }

Взято с Vingrad.ru https://forum.vingrad.ru