C#获取mac

验证计算机MAC地址进行软件授权是一种通用的方法,C#可以轻松获取计算机的MAC地址,本文采用实际的源代码讲述了两种获取网卡的方式,第一种 方法使用ManagementClass类,只能获取本机的计算机网卡物理地址,第二种方法使用Iphlpapi.dll的SendARP方法,可以获取 本机和其它计算机的MAC地址。

方法1:使用ManagementClass类

示例:

        /// <summary>
        /// 获取网卡物理地址
        /// </summary>
        /// <returns></returns>
        public static string getMacAddr_Local()
        {
            string madAddr = null;
            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc2 = mc.GetInstances();
            foreach (ManagementObject mo in moc2)
            {
                if (Convert.ToBoolean(mo["IPEnabled"]) == true)
                {
                    madAddr = mo["MacAddress"].ToString();
                    madAddr = madAddr.Replace(‘:‘, ‘-‘);
                }
                mo.Dispose();
            }
            return madAddr;
        }

说明:

1.需要给项目增加引用:System.Management

2.在程序开始添加包引入语句:using System.Management;

3.本方案只能获取本机的MAC地址;

方法2:使用SendARP类

示例:

        //下面一种方法可以获取远程的MAC地址
        [DllImport("Iphlpapi.dll")]
        static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
        [DllImport("Ws2_32.dll")]
        static extern Int32 inet_addr(string ipaddr);
        /// <summary>
        /// SendArp获取MAC地址
        /// </summary>
        /// <param name="RemoteIP">目标机器的IP地址如(192.168.1.1)</param>
        /// <returns>目标机器的mac 地址</returns>
        public static string getMacAddr_Remote(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();
            }
        }

说明:

1.在程序开始添加包引入语句:using System.Runtime.InteropServices;

2.该方法可以获取远程计算机的MAC地址;

C#获得本机MAC地址 - [Coding](转)

刚开始在机房推广我们组的系统,用户注册就失效了,debug了许久之后,发现居然是一直都在使用的获得MAC的地址的方法居然失效了——数据库报异常,以MAC为主键的表提示主键重复了   ,怎么可能啊?就好像GUID重复一样!!!!

对原来获得MAC的地址的代码做了测试,才发现在我机子居然运行的结果和在cmd下ipconfig的结果不同 ,仅是一个vm的mac。源码如下:

string MacAddress;
//设置MAC地址
string MAC="";
ManagementClass MC = new ManagementClass ( "Win32_NetworkAdapterConfiguration" );
ManagementObjectCollection MOC = MC.GetInstances();
foreach ( ManagementObject moc in MOC )
{
 if ( moc["IPEnabled"].ToString() == "True")
 {
  MAC = moc["MacAddress"].ToString();
 }
}
MacAddress=MAC;

经过在网络上寻找,找到了获得本机mac的方法,只是结果是一个ArrayList,运行的结果和cmd下命令一样,只是包括了一个真的mac和两个vm的mac,源码如下:

using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;

string strsearch=string.Format(@"SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL)AND (Manufacturer <> ‘Microsoft‘))");

System.Management.ManagementObjectSearcher msearch=new ManagementObjectSearcher();
msearch.Scope=new ManagementScope(@"root/CIMV2");
msearch.Query=new ObjectQuery(strsearch);
ArrayList MacList  =new ArrayList();
int i =0;
try
{
 if((msearch.Get().Count<1) || (msearch.Get()==null))
 {
  MessageBox.Show("No MAC Address!");
 }
 else
 {
  MessageBox.Show("MAC Address No. is : "+ msearch.Get().Count.ToString());
  foreach(System.Management.ManagementObject mymac in msearch.Get())
  {
   string str1=string.Format("MAC{0} address:{1}",i.ToString(),mymac["MACAddress"].ToString());
   MessageBox.Show("MAC Address "+i.ToString()+":"+str1);
   MacList.Add(str1);
   i++;
  }
 }
}
catch(Exception ex)
{
 string msg=ex.Message.ToString();
 MessageBox.Show("erro", msg);
}

由于没有办法确定获得mac那个真实的,所以又用了第三个方法,通过IP地址获得mac:

using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions; 

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

string IPAddress=System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].ToString();
MessageBox.Show("ip: "+IPAddress);
string mac = this.GetMACFromIP(IPAddress);
MessageBox.Show("mac: "+mac);

private   string   GetMACFromIP(string   A_strIP)
  {
   string   strRet   =   "Unknown";   

   string   strIPPattern   =   @"^/d+/./d+/./d+/./d+$";   

   Regex   objRex   =new   Regex(strIPPattern);   

   if(objRex.IsMatch(A_strIP)   ==   true)
   {
    Int32   intDest   =   inet_addr(A_strIP);
    Int32   []   arrMAC   =   new   Int32[2];
    Int32   intLen   =   6;   

    int   intResult   =   SendARP(intDest,0,ref   arrMAC[0],ref   intLen);   

    if(intResult   ==   0)
    {
     Byte   []   arrbyte   =   new   Byte[8];
     arrbyte[5]   =   (Byte)(arrMAC[1]   >>   8);
     arrbyte[4]   =   (Byte)arrMAC[1];
     arrbyte[3]   =   (Byte)(arrMAC[0]   >>   24);
     arrbyte[2]   =   (Byte)(arrMAC[0]   >>   16);
     arrbyte[1]   =   (Byte)(arrMAC[0]   >>   8);
     arrbyte[0]   =   (Byte)arrMAC[0];   

     StringBuilder   strbMAC   =   new   StringBuilder();   

     for(int   intIndex   =   0   ;intIndex   <   6;intIndex   ++)
     {
      if(intIndex   >   0)   strbMAC.Append("-");
      strbMAC.Append(arrbyte[intIndex].ToString("X2"));
     }
     strRet   =   strbMAC.ToString();
    }
   }
   return   strRet;
  }
时间: 2024-08-06 12:33:17

C#获取mac的相关文章

iOS 蓝牙获取MAC地址

援引:http://www.jianshu.com/p/1d6a8fc8134f iOS要获取蓝牙设备的MAC地址有两种:一是硬件工程师开通的服务特征下有MAC的信息,我们就从通道中获取:二是硬件工程师在扫描中设备信息中放置MAC信息,我们从有RSSI的函数中获取 1.形如你所在其他网站上看到的在某写板子模块上的服务如:"A180"的,其下均有获取到MAC的特征.此处我们略过,因为其他地方说的很清楚了,援引处也有.需要硬件配和加入服务特征. 2.就是在有RSSI的函数中获取. 首先先让

C#获取MAC地址

/// <summary> /// 获取MAC地址(返回第一个物理以太网卡的mac地址) /// </summary> /// <returns>成功返回mac地址,失败返回null</returns> public string getMacAddress() { string macAddress = null; try { NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterface

Python windows下获取MAC地址的一种方法

我最近有一个项目,使用Python在win32下开发一个COM组建,该COM组建其中一个方法是获取本地电脑的MAC地址. 需求很简单,虽然我是Python新手中的新手,但我还是会使用搜索引擎进行搜索. 百度一下,发现大部分都介绍使用import UUID获取MAC地址,或使用os.popen("ipconfig /all")的方式获取.而后者容易受到操作系统中英文环境影响. 如这篇文章:http://www.cnblogs.com/Jerryshome/archive/2011/11/

获取mac上所有文件

获取mac上所有文件 by 伍雪颖 #import <Cocoa/Cocoa.h> int main(int argc, const char * argv[]) { NSMutableArray *directoryDict = [NSMutableArray new]; [directoryDict addObject:@{@"url":[NSURL URLWithString:NSHomeDirectory()], @"id":@(0)}]; NS

android 获取MAC地址

由于WiFi 的Mac address 是一个被动咨询.一般在开机后,不会主动上到的系统里.要等待WiFi硬件启动后,才会把有关Mac address资料记载入系统去. 所以一般android系统获取Mac address时候会出现以下几种情况: 1.在WiFi打开的时候可以获取到Mac地址 2.关闭WiFi,不重启系统,也可以获取到Mac address 3.系统重启后,不打开WiFi,获取不到Mac address 4.系统重启后,不开开WiFi,打开2G.3G网络,获取不到Mac addr

android获取Mac地址和IP地址

获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信息获取本地Mac public static String getLocalMacAddressFromWifiInfo(Context context){ WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_

C#获取MAC地址的几种方法

首先需要用到的一些方法和类: public enum NCBCONST { NCBNAMSZ = 16, MAX_LANA = 254, NCBENUM = 0x37, NRC_GOODRET = 0x00, NCBRESET = 0x32, NCBASTAT = 0x33, NUM_NAMEBUF = 30, } [StructLayout(LayoutKind.Sequential)] public struct ADAPTER_STATUS { [MarshalAs(UnmanagedTy

【转载】获取MAC地址方法大全

From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情.到目前为止,作者尚未发现有任何一个通用的100%的适用于所有Windows平台的方法可以稳定的取得MAC地址.而有些应用(比如MMORPG)则需要稳定的得到机器的MAC地址,解决方案往往是通过多种方法依次使用来提高成功率. 说明: 以下方法只会返回多网卡的第一个MAC地址. 网上有很多文章和源码来解

linux win 通用的获取Mac的方法

经测试下面方法获取Mac跨平台 protected override void OnLoad(EventArgs e) { Response.Write(string.Join("<br/>", GetMacString())); Response.Write("<br/>"); base.OnLoad(e); } public NetworkInterface[] NetCardInfo() { return NetworkInterfac