Rede - capturar grupos, pcs e ips

Top  Previous  Next

uses Classes, Windows, SysUtils, WinSock;

 

function GetNetGroups(var Lista: TStringList): Boolean;

function GetNetComputers(const Grupo: string; var Lista: TStringList) : Boolean;

function GetNetIP(var Name, Address: string): Boolean;

function GetNetLocalName: string;

procedure GetNetIPs(var Lista: TStringList);

 

implementation

 

function GetNetGroups(var Lista: TStringList): Boolean;

type

  PMyRec = ^MyRec;

   MyRec = record

             dwScope      : Integer;

             dwType       : Integer;

             dwDisplayType: Integer;

             dwUsage      : Integer;

             LocalName    : string;

             RemoteName   : string;

             Comment      : string;

             Provider     : string;

           end;

 

  PnetResourceArr = ^TNetResource;

 

var

  NetResource        : TNetResource;

  TempRec            : PMyRec;

  Buf                : Pointer;

  Count, BufSize, Res: DWORD;

  lphEnum            : THandle;

  p                  : PNetResourceArr;

  i, j               : SmallInt;

  NetworkTypeList    : TList;

begin

  Result          := False;

  NetworkTypeList := TList.Create;

  Lista.Clear;

  GetMem(Buf, 8192);

  try

    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, nil,lphEnum );

    if Res <> 0 then raise Exception(Res);

    Count   := $FFFFFFFF;

    BufSize := 8192;

    Res     := WNetEnumResource( lphEnum, Count, Pointer( Buf ), BufSize );

    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

      New(TempRec);

      TempRec^.dwScope       := P^.dwScope;

      TempRec^.dwType        := P^.dwType ;

      TempRec^.dwDisplayType := P^.dwDisplayType ;

      TempRec^.dwUsage       := P^.dwUsage ;

      TempRec^.LocalName     := StrPas(P^.lpLocalName);

      TempRec^.RemoteName    := StrPas(P^.lpRemoteName);

      TempRec^.Comment       := StrPas(P^.lpComment);

      TempRec^.Provider      := StrPas(P^.lpProvider);

      NetworkTypeList.Add(TempRec);

      Inc(P);

    end;

    Res := WNetCloseEnum(lphEnum);

    if Res <> 0 then raise Exception(Res);

    for J := 0 to NetworkTypeList.Count-1 do

    begin

      TempRec     := NetworkTypeList.Items[J];

      NetResource := TNetResource(TempRec^);

      Res         := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

      if Res <> 0 then raise Exception(Res);

      while True do

      begin

        Count   := $FFFFFFFF;

        BufSize := 8192;

        Res     := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

        if Res = ERROR_NO_MORE_ITEMS then Break;

        if (Res <> 0) then raise Exception(Res);

        P := PNetResourceArr(Buf);

        for I := 0 to Count - 1 do

        begin

          Lista.Add(P^.lpRemoteName);

          Inc(P);

        end;

      end;

    end;

    Res := WNetCloseEnum(lphEnum);

    if Res <> 0 then raise Exception(Res);

    Result := True;

  finally

    FreeMem(Buf);

    NetworkTypeList.Destroy;

  end;

end;

 

function GetNetComputers(const Grupo: string; var Lista: TStringList) : Boolean;

type

  PnetResourceArr = ^TNetResource;

var

  NetResource : TNetResource;

  Buf         : Pointer;

  Count,

  BufSize, Res: DWord;

  Ind         : Integer;

  lphEnum     : THandle;

  Temp        : PNetResourceArr;

begin

  Result := False;

  Lista.Clear;

  GetMem( Buf, 8192 );

  try

    FillChar(NetResource, SizeOf(NetResource), 0);

    NetResource.lpRemoteName  := @Grupo[1];

    NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;

    NetResource.dwUsage       := RESOURCEUSAGE_CONTAINER;

    NetResource.dwScope       := RESOURCETYPE_DISK;

    Res                       := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,

                                              RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

    if Res <> 0 then Exit;

    // Código Mágico do WinSock...

    while True do

    begin

      Count   := $FFFFFFFF;

      BufSize := 8192;

      Res     := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

      if Res = ERROR_NO_MORE_ITEMS then Exit;

      if (Res <> 0) then Exit;

      Temp := PNetResourceArr(Buf);

      for Ind := 0 to Count - 1 do

      begin

        Lista.Add(Temp^.lpRemoteName + 2); // Adiciona os Computadores da Rede

        Inc(Temp);

      end;

    end;

    Res := WNetCloseEnum(lphEnum);

    if Res <> 0 then raise Exception(Res);

    Result := True;

  finally

    FreeMem(Buf);

  end;

end;

 

function GetNetIP(var Name, Address: string): Boolean;

var

  WSAData: TWSAData;

  HostEnt: PHostEnt;

begin

  WSAStartup(2, WSAData);

  SetLength(Name, StrLen( PChar( Name ) ) );

  HostEnt := GetHostByName( PChar( Name ) );

  Result := HostEnt = nil;

  if not Result then

    with HostEnt^ do

      Address := Format('%d.%d.%d.%d',[ Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);

  WSACleanup;

end;

 

function GetNetLocalName: String;

var

  pcName : PChar;

  Max_Len: DWord;

begin

  try

    Max_Len := MAX_COMPUTERNAME_LENGTH + 1;

    GetMem(pcName, Max_Len);

    GetComputerName(pcName, Max_Len);

  finally

    Result := pcName;

    FreeMem(pcName);

  end;

end;

 

procedure GetNetIPs(var Lista: TStringList);

var

  I            : Integer;

  Name, Address: String;

begin

  for I := 0 to Pred( Lista.Count ) do

  begin

    Name := Lista[I];

    GetNetIP( Name, Address );

    Lista[I] := Format( '%s - %s', [Name, Address] );

  end;

end;