Ir al contenido


Foto

Obtener las direcciones físicas de las adaptadores locales de red


  • Por favor identifícate para responder
2 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 julio 2012 - 04:31

A raíz de este hilo en que se trata de averiguar la dirección física MAC a través de una IP, se me ocurrió realizar lo mismo pero en un equipo local.

El siguiente ejemplo extrae los adaptadores de red en un equipo local y nos informa de su MAC. La base es la API GetAdaptersInfo que puede extraer bastantes datos mas de interés.

El ejemplo en C/C++: 
 

cpp
  1. //---------------------------------------------------------------------------
  2. #include <windows.h>
  3. #include <winsock2.h>
  4. #include <Iphlpapi.h>
  5. #include <stdio.h>
  6. #include <conio.h>
  7.  
  8. #pragma comment(lib, "iphlpapi.lib")
  9. #pragma hdrstop
  10. //---------------------------------------------------------------------------
  11.  
  12. void GetMACaddress(void)
  13. {
  14.   PIP_ADAPTER_INFO AI, pAI;
  15.   DWORD AILen;
  16.   GetAdaptersInfo(0, &AILen);
  17.   pAI = AI = (PIP_ADAPTER_INFO) new BYTE[AILen];
  18.   if(!GetAdaptersInfo(pAI, &AILen)){
  19.     do{
  20.       printf("%s: %.2X-%.2X-%.2X-%.2X-%.2X-%.2X", pAI->Description, pAI->Address[0], pAI->Address[1], pAI->Address[2], pAI->Address[3], pAI->Address[4], pAI->Address[5]);
  21.       pAI = pAI->Next;
  22.     } while(pAI);
  23.   }
  24.   delete [] AI;
  25.   getch();
  26. }
  27.  
  28. #pragma argsused
  29. int main(int argc, char* argv[])
  30. {
  31.   GetMACaddress();
  32.   return 0;
  33. }

Y ahora el ejemplo en delphi:
 

delphi
  1. program GetMACAddresses;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   Windows,
  7.   Winsock;
  8.  
  9. type
  10. PIP_ADDR_STRING = ^IP_ADDR_STRING;
  11. IP_ADDR_STRING = record
  12.   Next: PIP_ADDR_STRING;
  13.   IpAddress: array [0..15] of Char;
  14.   IpMask: array [0..15] of Char;
  15.   Context: DWORD;
  16. end;
  17.  
  18. PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  19. IP_ADAPTER_INFO = record
  20.   Next: PIP_ADAPTER_INFO;
  21.   ComboIndex: DWORD;
  22.   AdapterName: array [0..259] of Char;
  23.   Description: array [0..131] of Char;
  24.   AddressLength: UINT;
  25.   Address: array [0..7] of BYTE;
  26.   Index: DWORD;
  27.   Type_: UINT;
  28.   DhcpEnabled: UINT;
  29.   CurrentIpAddress: PIP_ADDR_STRING;
  30.   IpAddressList: IP_ADDR_STRING;
  31.   GatewayList: IP_ADDR_STRING;
  32.   DhcpServer: IP_ADDR_STRING;
  33.   HaveWins: BOOL;
  34.   PrimaryWinsServer: IP_ADDR_STRING;
  35.   SecondaryWinsServer: IP_ADDR_STRING;
  36.   LeaseObtained: Longint;
  37.   LeaseExpires: Longint;
  38. end;
  39.  
  40. function wsprintf(lpOut, lpFmt: PChar): Integer; cdecl; varargs; external 'User32.dll' name 'wsprintfA';
  41. function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external 'iphlpapi.dll';
  42.  
  43. procedure Get_MAC_Addresses;
  44. var
  45.   AI, pAI: PIP_ADAPTER_INFO;
  46.   AILen: DWORD;
  47.   Buff: array [0..19] of char;
  48. begin
  49.   GetAdaptersInfo(nil, AILen);
  50.   GetMem(AI, AILen); pAI:= AI;
  51.   if GetAdaptersInfo(pAI, AILen) = 0 then
  52.   repeat
  53.     wsprintf(Buff, '%.2X-%.2X-%.2X-%.2X-%.2X-%.2X',
  54.             pAI.Address[0], pAI.Address[1], pAI.Address[2], pAI.Address[3],
  55.             pAI.Address[4], pAI.Address[5], pAI.Address[6]);
  56.     Writeln(pAI.Description + ':  ' + Buff);
  57.     pAI:= pAI.Next;
  58.   until pAI = nil;
  59.   FreeMem(AI);
  60.   ReadLn;
  61. end;
  62.  
  63. begin
  64.   Get_MAC_Addresses;
  65. end.

Ambos son programas de consola que muestran los adaptadores de red instalados en el equipo junto con su MAC.


Saludos.
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 julio 2012 - 04:38

Hola,

http://delphi.jmrds.com/?q=node/21

:)
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 julio 2012 - 04:47

He estado viendo tu ejemplo, seoane, muy bueno.  (y).

El mio es mas simple sólo pertende extraer las MAC locales. Quisiera reseñar que la potente API que he usado, GetAdaptersInfo puede extraer casi todos los datos obtenidos con un IPConfig de una atacada.  :)


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.