Inicio > .NET Framework, C#, Cómo hacer > Cómo obtener la dirección MAC

Cómo obtener la dirección MAC


Hace algunas lunas publiqué cómo obtener el número serial del disco duro usando C# y WMI. Como una especie de continuación, ahora toca explicar cómo obtener la dirección MAC (MAC Address), igual utilizando C# y WMI.

La dirección MAC: Media Access Control, es un identificador único asignado a prácticamente cualquier adaptador o tarjeta de red, por parte del fabricante.

Para obtener este número MAC, usamos WMI, y para ello primero referenciamos el ensamblado System.Management.dll. Luego nos creamos un ManagementClass que apunte a la configuración de adaptadores de red. Y finalmente, iteramos sobre los objetos hasta encontrarlo. Nota que antes debemos saber si la tarjeta de red está habilitada, por lo que revisamos la propiedad IPEnabled para asegurarnos que así sea.

using System;
using System.Collections.Generic;
using System.Management;

namespace Fermasmas.Wordpress.Com
{
  class Program
  {
    static void Main(string[] args)
    {
      ManagementClass management =
           new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection adapters = management.GetInstances();

      List<string> macs = new List<string>();
      foreach (ManagementObject adapter in adapters)
      {
        bool isIpEnabled = (bool)(adapter["IPEnabled"] ?? false);
        if (isIpEnabled)
          macs.Add(adapter["MacAddress"] as string);
        adapter.Dispose();
      }

      foreach (string mac in macs)
        Console.WriteLine(mac);

      Console.ReadKey(true);
    }
  }
}

En la línea 11 creamos un objeto WMI que apunte hacia la configuración de adaptadores de red. Línea 13, obtenemos todos los adaptadores. Comenzamos a iterar sobre cada uno de estos. En la línea 18, obtenemos la propiedad IPEnabled del adaptador para saber si ese adaptador de red tiene la IP habilitada (i.e. está en uso). Si sí, obtenemos la propiedad MacAddress, que como habrás supuesto, es nuestra dirección MAC para ese adaptador. Y lixto. No olvides hacer un Dispose del objeto ManagementObject.

Y dado que actualmente estoy escribiendo el tutorial de Pininos con LINQ, pues cambiemos el código anterior por una consulta, ¿por qué no?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;

namespace Fermasmas.Wordpress.Com
{
  class Program
  {
    static void Main(string[] args)
    {
      ManagementClass mgmt
          = new ManagementClass("Win32_NetworkAdapterConfiguration");
      ManagementObjectCollection adapters = mgmt.GetInstances();

      IEnumerable<string> macs = from ManagementObject adapter in adapters
                     where (bool)(adapter["IPEnabled"] ?? false)
                     select adapter["MacAddress"] as string;

      foreach (string mac in macs)
        Console.WriteLine(mac);

      Console.ReadKey(true);
    }
  }
}

Hasta la próxima.

Anuncios
Categorías:.NET Framework, C#, Cómo hacer Etiquetas:
  1. gorums
    septiembre 20, 2011 en 12:49 pm

    Saludos
    Necesito obtener la mac, pero en un ambiente Gnu/Linux utilizando Mono.

    • septiembre 20, 2011 en 12:56 pm

      Aquí hay un ejemplo, espero te sirva.
      http://stackoverflow.com/questions/1746840/get-mac-address-in-linux-using-mono

      Si no, también encontré este ejemplo para obtener dicha dirección usando la función ioctl del API de Linux.


      #include <stdio.h>
      #include <sys/ioctl.h>
      #include <sys/types.h>
      #include <sys/socket.h>
      #include <net/if.h>

      int main( int argc, char *argv[] )
      {
      int s;
      struct ifreq buffer;

      s = socket(PF_INET, SOCK_DGRAM, 0);

      memset(&buffer, 0x00, sizeof(buffer));

      strcpy(buffer.ifr_name, "eth0");

      ioctl(s, SIOCGIFHWADDR, &buffer);

      close(s);

      for( s = 0; s < 6; s++ )
      {
      printf("%.2X ", (unsigned char)buffer.ifr_hwaddr.sa_data[s]);
      }

      printf("\n");

      return 0;
      }

      Desde Mono, podrías hacer una importación extern y así.

      Saludos.

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s