Jump to content


Photo

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


  • Please log in to reply
2 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 09 July 2012 - 04:31 AM

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
  • 1259 posts
  • LocationEspaña

Posted 09 July 2012 - 04:38 AM

Hola,

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

:)
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 09 July 2012 - 04:47 AM

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.