邀朋友种豆,一起分享吧
喜欢购买正品行货?那就去品牌街

C#读取MAC地址的方法收集

来自:种豆 时间:2017-12-29 阅读:595次 原文链接

    以下是收集的几种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


 
关于种豆 ┊ 联系我们 ┊ 免责声明 ┊ 发帖须知 ┊ 请提意见 ┊ 站点地图
本站为个人爱好兴趣分享网站,不代表本人观点,如有侵权请联系QQ3033380280进行处理
sowsoy.com 版权所有 Copyright©2010-2021 备案号:蜀ICP备2020025376号-3
Email:sowsoy#hotmail.com