几种C#程序读取MAC地址的方法

转自http://www.cnblogs.com/diulela/archive/2012/04/07/2436111.html

以下是收集的几种C#程序读取MAC地址的方法,示例中是读取所有网卡的MAC地址,如果仅需要读取其中一个,稍作修改即可。

1 通过IPConfig命令读取MAC地址

/// <summary>
///  根据截取ipconfig /all命令的输出流获取网卡Mac
/// </summary>
/// <returns></returns>
public  static  List < string >  GetMacByIPConfig()
{
  List
< string >  macs  = new  List < string > ();
  ProcessStartInfo startInfo = new ProcessStartInfo("ipconfig""/all");
  startInfo.UseShellExecute = false;
  startInfo.RedirectStandardInput = true;
  startInfo.RedirectStandardOutput = true;
  startInfo.RedirectStandardError = true;
  startInfo.CreateNoWindow = true;

  Process p 
=  Process.Start(startInfo);
  // 截取输出流
  StreamReader reader  =  p.StandardOutput;
  string  line  =  reader.ReadLine();

  while  ( ! reader.EndOfStream)
  {
    if  ( ! string .IsNullOrEmpty(line))
    {
      line 
=  line.Trim();

      if  (line.StartsWith( " Physical Address " ))
      {
        macs.Add(line);
      }
    }

    line 
=  reader.ReadLine();
  }

  // 等待程序执行完退出进程
  p.WaitForExit();
  p.Close();
  reader.Close();
 
  return  macs;
}

2 通过WMI读取MAC地址

    1)该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,该方法无法取得MAC地址。
 
/// <summary>
///  通过WMI读取系统信息里的网卡MAC
/// </summary>
/// <returns></returns>
public static  List < string >  GetMacByWMI()
{
  List
< string >  macs  = new  List < string > ();
  try
  {
    string  mac  = "" ;
    ManagementClass mc 
= new  ManagementClass( " Win32_NetworkAdapterConfiguration " );
    ManagementObjectCollection moc 
=  mc.GetInstances();
    foreach  (ManagementObject mo  in  moc)
    {
      if  (( bool )mo[ " IPEnabled " ])
      {
        mac 
=  mo[ " MacAddress " ].ToString();
        macs.Add(mac
);
      }
    }
    moc 
= null ;
    mc 
= null ;
  }
  catch
  {

  }

  return  macs;
}

3 通过NetworkInterface读取MAC地址

    1)如果当前的网卡是禁用状态(硬件处于硬关闭状态),取不到该网卡的MAC地址,(您可以通过禁用网卡进行试验)。
    2)如果当前启用了多个网卡,最先返回的地址是最近启用的网络连接的信息
 
// 返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。
public static  NetworkInterface[] NetCardInfo()
{
  return  NetworkInterface.GetAllNetworkInterfaces();
}

/// <summary>
///  通过NetworkInterface读取网卡Mac
/// </summary>
/// <returns></returns>
public static  List < string >  GetMacByNetworkInterface()
{
  List
< string >  macs  = new  List < string > ();
  NetworkInterface[] interfaces 
=  NetworkInterface.GetAllNetworkInterfaces();
  foreach  (NetworkInterface ni  in  interfaces)
  {

    macs.Add(ni.GetPhysicalAddress().ToString());
  }
  return  macs;
}

4 通过SendARP读取MAC地址

/// <summary>
///  通过SendARP获取网卡Mac
///  网络被禁用或未接入网络(如没插网线)时此方法失灵
/// </summary>
/// <param name="remoteIP"></param>
/// <returns></returns>
public static string  GetMacBySendARP( string  remoteIP)
{
  StringBuilder macAddress 
= new  StringBuilder();

  try
  {
    Int32 remote 
=  inet_addr(remoteIP);

    Int64 macInfo 
= new  Int64();
    Int32 length 
= 6 ;
    SendARP(remote, 
0 ref  macInfo,  ref  length);

    string  temp  =  Convert.ToString(macInfo,  16 ).PadLeft( 12 ' 0 ' ).ToUpper();

    int  x  = 12 ;
    for  ( int  i  = 0 ; i  < 6 ; i ++ )
    {
      if  (i  == 5 )
      {
        macAddress.Append(temp.Substring(x 
- 2 2 ));
      }
      else
      {
        macAddress.Append(temp.Substring(x 
- 2 2 + " - " );
      }
      x 
-= 2 ;
    }

    return  macAddress.ToString();
  }
  catch
  {
    return  macAddress.ToString();
  }
}

[DllImport(
" Iphlpapi.dll " )]
private static extern int  SendARP(Int32 dest, Int32 host,  ref  Int64 mac,  ref  Int32 length);
[DllImport(
" Ws2_32.dll " )]
private static extern  Int32 inet_addr( string  ip);

5 从注册表读取MAC地址

    常规用户可通过读取注册表项Windows Genuine Advantage获取到物理网卡地址。

    1)如果注册表项被修改,则无法取得该MAC地址

 

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Genuine Advantage
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值