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
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
try
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
GetHostName(@s, 128);
p := GetHostByName(@s);
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
Result := Result + p2;
WSACleanup;
except
Result := '';
end;
end;
function DameMACLocal: string;
var 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
IPLocal := DameIPLocal;
Indice := -1;
try
Locator := CoSWbemLocator.Create; 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;
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
end;
if (Indice >= 0) then
begin
try
Locator := CoSWbemLocator.Create; 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 on Exception do
Result := 'ERR';
end;
end
else
Result := '';
end;