Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight

El identificador de la tarjeta de red

Como todos sabemos, cada tarjeta de red se identifica por medio de un número de 48 bits que es único. Para recuperar este valor (en una máquina que tenga tarjeta de red, por supuesto) podemos utilizar funciones de NetBios. Hay que tener en cuenta que una misma máquina puede tener instalada más de un adaptador de red. Pero si quiere una función sencilla que le dé el identificador de la tarjeta principal, podemos basarnos en que el algoritmo de generación de identificadores únicos para OLE utiliza este valor para garantizar la unicidad del resultado.

function GetNetworkID: string;
var
  G: TGuid;
begin
  OleCheck(CoCreateGuid(G));
  Result := GuidToString(G);
  Result := Copy(Result, Length(Result) - 12, 12);
end;

Para comprobar el resultado de la función, ejecute el programa winipcfg en su Windows (ipconfig en Win2K/XP) y compare el identificador de la tarjeta que este programa nos muestra. Puede también teclear en el editor de Delphi o C++ Builder la combinación Ctrl+May+G.

Un detalle final: he utilizado el tipo string para el valor de retorno. Pero también es posible retornar el valor como un Int64.

... Y AHORA, EN .NET

Tenga presente que la versión original de este truco es bastante antigua. En el momento en que lo escribí, Microsoft todavía incluía el MAC al generar GUIDs. Pero como puede imaginar, esto podía comprometer la privacidad de los usuarios; al menos, hubo quejas al respecto. El actual algoritmo no incluye el MAC de la tarjeta de red. Además, hoy es muy frecuente encontrar máquinas con más de una tarjeta de red.

¿Cómo se puede obtener las direcciones MAC utilizando la plataforma .NET? He probado este truco con la versión 2.0, y es bastante sencillo, incluso para recordar:

using System;
using System.Net.NetworkInformation;

namespace NetInfo
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (NetworkInterface intf in
                NetworkInterface.GetAllNetworkInterfaces())
                Console.WriteLine(intf.GetPhysicalAddress());
        }
    }
}

Si lo que se desea es obtener las direcciones IP con las que se suele trabajar con mayor frecuencia, hay que recordar que cada interfaz de red física puede tener varias direcciones asociadas. Tendríamos que añadir un bucle anidado al código anterior, para que mostrase las direcciones de cada interfaz de red encontrada. Si mantenemos el convenio del fragmento de código anterior, y consideramos que la variable intf contiene la información sobre el dispositivo de red, nos valdría lo siguiente:

    // ...
    foreach (UnicastIPAddressInformation info in
        intf.GetIPProperties().UnicastAddresses)
        Console.WriteLine(info.Address);
    // ...

Como curiosidad, compruebe que una de las "interfaces" encontradas por GetAllNetworkInterfaces tiene una MAC vacía y corresponde al bucle local: ése que recibe automáticamente la dirección 127.0.0.1.