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;
}
- C#获得本机MAC地址 - [Coding](转)
- C#获得本机物理网卡的MAC地址
- C#获得本机物理网卡的MAC地址(备忘)
- C#获得本机物理网卡的MAC地址而非虚拟网卡MAC地址
- 获得本机IP和MAC地址
- 纯Java获得本机MAC地址
- C#获得本机IP和Mac
- C#获得mac地址
- C#获取本机的MAC地址
- C#获取本机的MAC地址
- C#获取本机的MAC地址
- C#获取本机MAC地址
- C# 获取本机IP MAC地址
- C#获取本机MAC地址
- 获得本机地址
- linux下获得本机mac地址函数
- C#获得本机的计算机名及IP地址
- C#获得本机的公网IP地址
- Transparent Controls with custom image backgrounds on PocketPC
- java puzzler - URL
- dnn学习-使module中的控件支持ajax
- java puzzler - 三目运算
- 个v
- C#获得本机MAC地址 - [Coding](转)
- access violation at address 00000000.read of address 00000000
- 如何点击OK后ProperSheet不自动关闭
- java puzzler - Swap Meat
- Flex组件开发总结
- C++ 上路笔记
- ShellExecute, WinExec, CreateProcess
- 接口 vs 抽象类
- CoInitialize与CoInitializeEx,AfxOleInit()的不同 控制台程序中AfxOleInit失效原因