Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtener la dirección MAC (MAC ADDRESS) (https://www.clubdelphi.com/foros/showthread.php?t=70071)

movorack 28-09-2010 18:55:41

Obtener la dirección MAC (MAC ADDRESS)
 
Se que el tema se ha tratado muchas veces aqui en los foros pero quiero compartir con ustedes unas cuantas lineas de cosas que he podido encontrar aquí y allá y el resultado que he obtenido.

Estaba indagando la forma de obtener un identificador unico por equipo que no fuera aleatorio (como los GUID) y que se mantuviera a lo largo de los constantes formateos. esto no para asuntos de licenciamiento (aunque puede funcionar), mas bien para ser utilizado como identificador en una sesión de clases (educación)

Al final opté por armar una cadena (algo entreversada) con el serial de la bios, el serial del disco y la mac de la ethernet principal; sacar el MD5 de esto y almacenarla en la DB como identificador único por equipo.

Tuve algunos problemas para obtener el serial del disco hasta que encontré los componentes WMI de nuestro compañero *neftalí*. muy buen trabajo por cierto. :D... gracias por compartirlo.

Con estos componentes obtuve el serial de la Bios y del Disco duro.

Ahora queria obtener la MAC de la ethernet principal y no lo habia conseguido. todas las indicaciones que encontraba aquí en el foro y fuera de el me llevaban o a crear un GUID o me arrojaban resultados inexactos.

pero luego de echar de aquí y de allá me encontré con una porción de código que hace uso de las Jedi API Header Library para obtener la MAC sin usar netbios.

y aquí les dejo el código para obtener la mac de tu equipo (despues de tanta lora :D)

Código Delphi [-]
interface

uses .. JwaIpHlpApi, JwaIpTypes .. ;

function get_adapters_info: TStrings;

implementation

..

function get_adapters_info: TStrings;
const
  WIRELESS_ADAPTER = 71;
  ETHERNET_ADAPTER = 6;

var
  NumInterfaces: Cardinal;
  AdapterInfo: array of TIpAdapterInfo;
  OutBufLen: ULONG;
  i: integer;
  mac, Tipo : string;
  AdaptersInfo : TStrings;
begin
  GetNumberOfInterfaces(NumInterfaces);
  SetLength(AdapterInfo, NumInterfaces);
  OutBufLen := NumInterfaces * SizeOf(TIpAdapterInfo);
  GetAdaptersInfo(@AdapterInfo[0], OutBufLen);

  AdaptersInfo := TStringList.Create;

  for i := 0 to NumInterfaces - 1 do begin

    mac := Format('%.2x:%.2x:%.2x:%.2x:%.2x:%.2x',
          [AdapterInfo[i].Address[0], AdapterInfo[i].Address[1],
           AdapterInfo[i].Address[2], AdapterInfo[i].Address[3],
           AdapterInfo[i].Address[4], AdapterInfo[i].Address[5]]);

    case AdapterInfo[i].Type_ of
      WIRELESS_ADAPTER : Tipo := 'WIF';
      ETHERNET_ADAPTER : Tipo := 'ETH';
    end;

    if AdapterInfo[i].Description <> EmptyStr then
      AdaptersInfo.Add(IntToStr(i)
               + ' - ' + Tipo
               + ' - ' + AdapterInfo[i].Description
               + ' - ' + mac);
  end;
  Result := AdaptersInfo;
end;

henystronic 13-06-2011 15:45:34

para delphi 2010
 
estuve usando la funcion, y corre perfectamente en delphi 7 el problema es que para delphi 2010 no funciona ya que me da error al compilar y es con respecto a que son incompatibles pchar y ansichar; finalmente modifique una variable y funciono perfecto aqui les dejo la funcion;
uses NB30;
Código Delphi [-]
 
function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
  URetCode: PChar;
  RetCode: ansichar;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);
  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[i];
   RetCode          := Netbios(Ncb);
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[i];
    // Must be 16
    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := Pointer(Adapter);
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;

ecfisa 13-06-2011 17:21:19

Hola henystronic y bienvenido a los foros de Club Delphi.:)

Primero que nada gracias por acercarnos la solución que encontraste.

Y en segundo término te ruego que encierres entre etiquetas el código incluido en tus mensajes. (en ese caso: [delphi] [/delphi]).
En este enlace tenés el listado de códigos vB con las etiquetas de uso para los diferentes códigos.

Un saludo.

marcial 23-03-2012 10:28:07

Hola a todos:
El problema que tiene el GetMacAdress para identificar un equipo por su tarjeta de red es que si no está el cable conectado no la reconoce (al menos en W7)
¿Conoce alguno la solución?
Muchas Gracias
Marcial

rretamar 23-03-2012 13:28:04

Un código que usé una vez:

Código Delphi [-]
Function GetPrimaryNicMacAddress: String;
Type
  TGUID = Record
    A, B: word;
    D, M, S: word;
    MAC: Array[ 1..6 ] Of byte;
  End;
Var
  UuidCreateFunc: Function(Var guid: TGUID): HResult; stdcall;
  handle: THandle;
  g: TGUID;
  WinVer: _OSVersionInfoA;
  i: integer;
  //  ErrCode : HResult;
Begin
  Try
    WinVer.dwOSVersionInfoSize := sizeof(WinVer); // Tamaño
    getversionex(WinVer);  // Obtiene info del Windows en uso
    handle := LoadLibrary('RPCRT4.DLL'); // Obtiene el handle de la DLL
    If WinVer.dwMajorVersion >= 5 Then {Windows 2000 ó superior}
      @UuidCreateFunc := GetProcAddress(Handle, 'UuidCreateSequential')
    Else // (Win98 o menor)
      @UuidCreateFunc := GetProcAddress(Handle, 'UuidCreate');
    UuidCreateFunc(g); // Obtiene la info
    Result := '';
    For i := 1 To 6 Do Result := Result + IntToHex(g.MAC[ i ], 2); // Concatena la MAC Address
  Except
    Result := ''; // Resultado nulo
  End;
End;

marcial 23-03-2012 19:05:55

Gracias Rretamar, con esta rutina no hace falta tener el cable de red enchufado ni el NB30 en el uses

rretamar 24-03-2012 15:56:03

Cita:

Empezado por marcial (Mensaje 428330)
Gracias Rretamar, con esta rutina no hace falta tener el cable de red enchufado ni el NB30 en el uses

¿ Es una pregunta ? :confused:

No, no se necesita que la placa de red esté funcionando. Basta con que esté instalada para obtener su dirección MAC.

alquimista 20-03-2013 23:54:44

He probado esta rutina y no muestra la mac de la tarjeta de red instalada..

En mi caso tengo instalada una maquina virtual y obtiene la mac de la tarjeta virtual...


Alguien conoce una solución que obtenga la mac de la tarjeta real???
gracias


La franja horaria es GMT +2. Ahora son las 15:08:23.

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