zoukankan      html  css  js  c++  java
  • 几种C#程序读取MAC地址的方法

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

    1 通过IPConfig命令读取MAC地址

    ///<summary>
    /// 根据截取ipconfig /all命令的输出流获取网卡Mac
    ///</summary>
    ///<returns></returns>
    publicstatic 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>
    publicstatic 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)如果当前启用了多个网卡,最先返回的地址是最近启用的网络连接的信息
    //返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。
    publicstatic NetworkInterface[] NetCardInfo()
    {
      return NetworkInterface.GetAllNetworkInterfaces();
    }
    
    ///<summary>
    /// 通过NetworkInterface读取网卡Mac
    ///</summary>
    ///<returns></returns>
    publicstatic 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>
    publicstaticstring 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")]
    privatestaticexternint SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
    [DllImport("Ws2_32.dll")]
    privatestaticextern Int32 inet_addr(string ip);

    5 从注册表读取MAC地址

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

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

    HKEY_LOCAL_MACHINESoftwareMicrosoftWindows Genuine Advantage

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

    1 通过IPConfig命令读取MAC地址

    ///<summary>
    /// 根据截取ipconfig /all命令的输出流获取网卡Mac
    ///</summary>
    ///<returns></returns>
    publicstatic 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>
    publicstatic 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)如果当前启用了多个网卡,最先返回的地址是最近启用的网络连接的信息
     
    //返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。
    publicstatic NetworkInterface[] NetCardInfo()
    {
      return NetworkInterface.GetAllNetworkInterfaces();
    }

    ///<summary>
    /// 通过NetworkInterface读取网卡Mac
    ///</summary>
    ///<returns></returns>
    publicstatic 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>
    publicstaticstring GetMacBySendARP(string remoteIP)
    {
      StringBuilder macAddress 
    =new StringBuilder();

      try
      {
        Int32 remote 
    = inet_addr(remoteIP);

        Int64 macInfo 
    =new Int64();
        Int32 length 
    =6;
        SendARP(remote, 
    0ref 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 
    -22));
          }
          else
          {
            macAddress.Append(temp.Substring(x 
    -22+"-");
          }
          x 
    -=2;
        }

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

    [DllImport(
    "Iphlpapi.dll")]
    privatestaticexternint SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
    [DllImport(
    "Ws2_32.dll")]
    privatestaticextern Int32 inet_addr(string ip);

    5 从注册表读取MAC地址

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

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

  • 相关阅读:
    用户 NT AUTHORITY\NETWORK SERVICE 登录失败解决方法
    [转]改变ASP.NET 2.0中的Membership的密码要求
    WINDOWS2003自动开关机的实现
    解决ASP.NET 的进程帐户没有访问 IIS的权限[转]
    byron的一首好诗
    推荐一个好用的日期控件
    程序员喝酒文化
    快速清除Word文档多余空行
    net2.0"服务器应用程序不可用"问题解决[转]
    GridView的第一列是ButtonField,字段名是"删除",想一点之后弹出确认框,否则返回.应该如何写?
  • 原文地址:https://www.cnblogs.com/Jayesslee/p/9395925.html
Copyright © 2011-2022 走看看