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

来源:互联网 发布:java等级划分英语缩写 编辑:程序博客网 时间:2024/06/05 02:56

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://jessiexxb.blogbus.com/logs/7472771.html

刚开始在机房推广我们组的系统,用户注册就失效了,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;

stringstrsearch=string.Format(@"SELECT MACAddress FROM Win32_NetworkAdapterWHERE ((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;  
  }