Ver Mensaje Individual
  #7  
Antiguo 27-08-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Por lo que parece, ese procedimiento obtiene la MAC a partir de un GUID.
La GUID se generaba a partir de la MAC del ordenador y otras variables mas, para tener un identificador único en el mundo. Esto generó un problema de privacidad, ya que se podía identificar al ordenador que había generado ese valor.
Este problema de privacidad hizo que los GUID no se generaran con la MAC del ordenador.

http://es.wikipedia.org/wiki/Globally_unique_identifier
Cita:
El algoritmo empleado para generar nuevos GUID ha sido ampliamente criticado. Al principio, la dirección MAC de la tarjeta de red del usuario se usaba como base para varios dígitos del identificador, lo que significa, por ejemplo, que un documento podía ayudar a averiguar qué ordenador lo había creado. Este agujero en la privacidad se utilizó para localizar al creador del gusano Melissa. Después de que esto se descubriera, Microsoft cambió el algoritmo, por lo que ya no se usa la dirección MAC.
La solución a esto es obtener la MAC de otra manera.
Yo lo hago de dos formas:
Busco la MAC de una direccion IP (para buscar la MAC del servidor de la base de datos)
Busco la MAC del ordenador. (esto puede traer algún problema si es un portatil y a veces se conecta por wifi y otras por ethernet)
Espero te sirva.

Código Delphi [-]
function MySendARP(const IPAddress: string): string;
var
  DestIP : ULONG;
  MacAddr : array [0..5] of byte;
  MacAddrLen : ULONG;
  SendArpResult : cardinal;
begin
  /// Devuelve la direccion MAC de una direccion IP

  DestIP := inet_addr(PAnsiChar(AnsiString(IPAddress)));
  MacAddrLen := Length(MacAddr);
  SendArpResult := SendARP(DestIP, 0, @MacAddr, @MacAddrLen);

  if SendArpResult = NO_ERROR then
     Result := 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]])
  else
     Result := '';
end;

function DameIPLocal: string;
var
  p : PHostEnt;
  s : array[0..128] of char;
  p2 : PChar;
  wVersionRequested : word;
  wsaData : TWSAData;
begin
  /// Devuelve la direccion IP del ordenador

  // Arranca la librería WinSock
  try
     wVersionRequested := MAKEWORD(1, 1);
     WSAStartup(wVersionRequested, wsaData);

     // Obtiene el nombre del PC
     GetHostName(@s, 128);
     p := GetHostByName(@s);

     // Obtiene la dirección IP y libera la librería WinSock
     p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
     Result := Result + p2;
     WSACleanup;
  except
     Result := '';
  end;
end;

function DameMACLocal: string;
var  // These are all needed for the WMI querying process
  Locator : ISWbemLocator;
  Services : ISWbemServices;
  SObject : ISWbemObject;
  ObjSet : ISWbemObjectSet;
  SProp : ISWbemProperty;
  Enum : IEnumVariant;
  Value : cardinal;
  TempObj : olevariant;
  Valor : string;
  Indice : integer;
  IPAddress : string;
  IPLocal : string;
begin
  /// Devuelve la direccion MAC del adaptador de red que da la IP al ordenador

  // Direccion de IP local del ordenador
  IPLocal := DameIPLocal;
  // Busco el indice del adaptador con la IP local
  Indice := -1;
  try
     Locator := CoSWbemLocator.Create;  // Create the Location object
     // Connect to the WMI service, with the root\cimv2 namespace
     Services := Locator.ConnectServer('', 'root\cimv2', '', '', '', '', 0, nil);
     ObjSet := Services.ExecQuery('SELECT Index, IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True', 'WQL',
        wbemFlagReturnImmediately and wbemFlagForwardOnly, nil);
     Enum := (ObjSet._NewEnum) as IEnumVariant;
     while (Enum.Next(1, TempObj, Value) = S_OK) do
     begin
        SObject := IUnknown(tempObj) as ISWBemObject;
        SProp := SObject.Properties_.Item('IPAddress', 0);
        if VarIsNull(SProp.Get_Value) then
           Valor := ''
        else
           Valor := SProp.Get_Value[0];

        IPAddress := Valor;

        // Si la direccion del adaptador es la local, obtengo el indice
        if (IPLocal = IPAddress) then
        begin
           SObject := IUnknown(tempObj) as ISWBemObject;
           SProp := SObject.Properties_.Item('Index', 0);
           if VarIsNull(SProp.Get_Value) then
              Valor := ''
           else
              Valor := SProp.Get_Value;

           Indice := StrToIntDef(Valor, 0);
        end;
     end;
  except // Trap any exceptions (Not having WMI installed will cause one!)

  end;

  // Obtengo la MAC del adaptador con el indice obtenido
  if (Indice >= 0) then
  begin
     try
        Locator := CoSWbemLocator.Create;  // Create the Location object
        // Connect to the WMI service, with the root\cimv2 namespace
        Services := Locator.ConnectServer('', 'root\cimv2', '', '', '', '', 0, nil);
        ObjSet := Services.ExecQuery('SELECT MACAddress FROM Win32_NetworkAdapter WHERE Index = ' + IntToStr(Indice), 'WQL',
           wbemFlagReturnImmediately and wbemFlagForwardOnly, nil);
        Enum := (ObjSet._NewEnum) as IEnumVariant;
        while (Enum.Next(1, TempObj, Value) = S_OK) do
        begin
           SObject := IUnknown(tempObj) as ISWBemObject;
           SProp := SObject.Properties_.Item('MACAddress', 0);
           if VarIsNull(SProp.Get_Value) then
              Valor := ''
           else
              Valor := SProp.Get_Value;

           Result := Valor;
        end;
     except // Trap any exceptions (Not having WMI installed will cause one!)
        on Exception do
           Result := 'ERR';
     end;
  end
  else
     Result := '';
end;
Responder Con Cita