Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Identificar los equipos de la red (https://www.clubdelphi.com/foros/showthread.php?t=82202)

marcial 07-02-2013 14:18:13

Identificar los equipos de la red
 
Hola a todos:
Trabajo con D5 y, aunque llevo mucho tiempo buscando, no he encontrado nada sencillo para identificar los equipos que estan conectados a la red.
Me gustaria obtener algo como esto, en un Memo o ListView, etc.:

Servidor 192.168.1.2
Puesto1 192.168.1.3
Puesto2 192.168.1.4

He buscado (trucomania,About,DelphiPages, etc) y hay algunas cosas que te dan mucha información (recursos y tipos, etc) pero no van bien en Delphi5. Otras (ya tengo una), para obtener sólo el nombre de MI equipo y MI IP, pero necesito las de toda la red.

Muchas gracias por vuestro tiempo.

TOPX 07-02-2013 14:35:38

Hola,

Pues, acabo de encontrar:
Para probarla, como en D5 no hay StrUtils, sólo debí cambiar los llamados a StartsStr() y PosEx() por una implementación propia y listo.

Espero que le sirva.

-

marcial 07-02-2013 14:57:54

Gracias POX, voy a probarlas y te cuento.

marcial 07-02-2013 22:32:20

Hola TopX
He systituido los Startstr y los PosEx pero no entiendo bien cómo lo hace. He puesto un showmessage, ejecuta las rutinas y me da los nombres de los puestos, pero cuado pongo un memo en el form y donde tengo el shoemessage (en el procedure ScanLevel) me dice que no existe ningún memo (cuando yo lo estoy viendo en el formulario y además está definido junto con un button y un edit).
Seguiré buscando.
Muchas gracias de todas formas.

TOPX 08-02-2013 00:45:18

marcial,

El código referido está orientado a ser utilizado en una aplicación de consola; de esa manera sólo basta el cambio de las funciones mencionadas.

Ya si lo quiere utilizar en una aplicación visual, el trabajo es diferente. Por este medio tal vez no pueda explicar bien que los procedure deben ser miembros de una clase a la que se pueda acceder, pero en el siguiente hilo hay un ejemplo que tal vez le guíe: -

marcial 08-02-2013 09:11:10

Gracias TOPX
Intentaré adaptarlo y si no lo consigo , porque tampoco tengo las uses que necesita, consultaré al cliente para ver si se puede cambiar el programa para omitir este paso.
Gracias otra vez por tu atención.

TOPX 08-02-2013 18:38:05

2 Archivos Adjunto(s)
Para quien le sirva:
1) A continuación, el código original, publicado en Network infrastructure discovery - StackOverflow por [RRUZ]:
Código Delphi [-]
{$APPTYPE CONSOLE}

{$R *.res}

uses
  StrUtils, Windows, WinSock, SysUtils;

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..1023] of TNetResource;

function SendArp(DestIP,SrcIP: ULONG;pMacAddr: pointer;PhyAddrLen: pointer): DWord; 
  StdCall; external 'iphlpapi.dll' name 'SendARP';

function GetIPAddress(const HostName: AnsiString): AnsiString;
var
  HostEnt: PHostEnt;
  Host: AnsiString;
  SockAddr: TSockAddrIn;
begin
  Result := '';
  Host := HostName;
  if Host = '' then
  begin
    SetLength(Host, MAX_PATH);
    GetHostName(PAnsiChar(Host), MAX_PATH);
  end;
  HostEnt := GetHostByName(PAnsiChar(Host));
  if HostEnt <> nil then
  begin
    SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
    Result := inet_ntoa(SockAddr.sin_addr);
  end;
end;

function GetMacAddr(const IPAddress: AnsiString; var ErrCode : DWORD): AnsiString;
var
 MacAddr    : Array[0..5] of Byte;
 DestIP     : ULONG;
 PhyAddrLen : ULONG;
begin
  Result    :='';
  ZeroMemory(@MacAddr,SizeOf(MacAddr));
  DestIP    :=inet_addr(PAnsiChar(IPAddress));
  PhyAddrLen:=SizeOf(MacAddr);
  ErrCode   :=SendArp(DestIP,0,@MacAddr,@PhyAddrLen);
  if ErrCode = S_OK then
   Result:=AnsiString(Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
    [MacAddr[0], MacAddr[1],MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]]));
end;

function ParseRemoteName(Const lpRemoteName : string) : string;
begin
  Result:=lpRemoteName;
  if StartsStr('\\', lpRemoteName) and (Length(lpRemoteName)>2) and 
  (LastDelimiter('\', lpRemoteName)>2) then
   Result:=Copy(lpRemoteName, 3, PosEx('\', lpRemoteName,3)-3)
  else
  if StartsStr('\\', lpRemoteName) and (Length(lpRemoteName)>2) and 
  (LastDelimiter('\', lpRemoteName)=2) then
   Result:=Copy(lpRemoteName, 3, length(lpRemoteName));
end;

function CreateNetResourceList(ResourceType: DWord;
                              NetResource: PNetResource;
                              out Entries: DWord;
                              out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType, 0, NetResource, EnumHandle) = NO_ERROR then
  begin
    try
      BufSize := $4000;  // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then
          begin
            ReAllocMem(List, BufSize);
          end;
        until Res <> ERROR_MORE_DATA;

        Result := Res = NO_ERROR;
        if not Result then
        begin
          FreeMem(List);
          List := Nil;
          Entries := 0;
        end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord);

  procedure ScanLevel(NetResource: PNetResource);
  var
    Entries: DWord;
    NetResourceList: PNetResourceArray;
    i: Integer;
    IPAddress, MacAddress : AnsiString;
    ErrCode : DWORD;
  begin
    if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
      for i := 0 to Integer(Entries) - 1 do
      begin
        if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
          (NetResourceList[i].dwDisplayType = DisplayType) then
          begin
            IPAddress   :=GetIPAddress(ParseRemoteName(AnsiString(NetResourceList[i].lpRemoteName)));
            MacAddress  :=GetMacAddr(IPAddress, ErrCode);
            Writeln(Format('Remote Name %s Ip %s MAC %s',
              [NetResourceList[i].lpRemoteName, IPAddress, MacAddress]));
          end;
        if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
          ScanLevel(@NetResourceList[i]);
      end;
    finally
      FreeMem(NetResourceList);
    end;
  end;
begin
  ScanLevel(Nil);
end;

var
  WSAData: TWSAData;
begin
  try
   if WSAStartup($0101, WSAData)=0 then
   try
     ScanNetworkResources(RESOURCETYPE_ANY, RESOURCEDISPLAYTYPE_SERVER);
     Writeln('Done');
   finally
     WSACleanup;
   end;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.

2) Y adjunto a este mensaje
  • captura de pantalla de la aplicación de consola y
  • el código fuente adaptado (improvisadamente) para una aplicación visual hecha en Delphi 5.

-

marcial 09-02-2013 07:59:27

Hola TOPX

Gracias por intentar ayudarme, pero por desgracia hay un problema cuando trato de descomprimir el archivo adaptado para Delphi5.
Dice 82202.zip: Final Inesperado del Archivo.

¿Podrías intentar subirlo otra vez?
De todas formas, te debo una.
Gracias otra vez

Casimiro Notevi 09-02-2013 10:58:15

Yo lo he descargado sin problemas.

ecfisa 09-02-2013 19:04:46

Hola.

Tampoco tuve problemas en abrir o descargar el archivo. (Mozilla Firefox)

Saludos.

MAXIUM 09-02-2013 20:41:32

¿Hay forma de obtener los comentarios?. Algo tan útil en hasta Windows XP y que desapareció en Windows 7

marcial 09-02-2013 21:20:00

Ahora si lo he podido abrir sin problemas. Con Mozilla Firefox.
Gracias por el aporte.


La franja horaria es GMT +2. Ahora son las 17:31:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi