Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #7  
Antiguo 27-08-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Porblema para Graficar nelostanley Gráficos 2 18-05-2012 01:19:31
Porblema de conexion chipsoni Conexión con bases de datos 0 08-02-2007 07:44:49
obtener el dia,mes y año noe Firebird e Interbase 3 17-02-2005 07:49:22
Porblema con subtotales y totales Choclito Impresión 1 08-10-2004 11:24:31
Porblema con fecha agora18 Varios 4 30-01-2004 17:53:10


La franja horaria es GMT +2. Ahora son las 05:06:54.


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