C#如何获得设备Mac地址
2010-06-02 09:31
387 查看
利用dns类和WMI规范获取IP及MAC地址
在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.
示例:
在这段代码中使用了两个类,一个是Dns类,另一个为IPHostEntry类,二者都存在于命名空间System.Net中.
Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上面的代码第一行就从本地的DNS中检索出本地主机名.
IPHostEntry类则将一个域名系统或主机名与一组IP地址相关联,它与DNS类一起使用,用于获取主机的IP地址组.
要获取远程主机的IP地址,其方法也是大同小异.
在获取了IP地址后,如果还需要取得网卡的MAC地址,就需要进一步探究了.
这里又分两种情况,一是本机MAC地址,二是远程主机MAC地址.二者的获取是完全不同的.
在获取本机的MAC地址时,可以使用WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中.
ManagementObjectSearcher类用于根据指定的查询检索管理对象的集合
ManagementObjectCollection类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它.
示例:
获取远程主机的MAC地址时,需要借用API函数SendARP.该函数使用ARP协议,向目的主机发送ARP包,利用返回并存储在高速缓存中的IP和MAC地址对,从而获取远程主机的MAC地址.
示例:
但使用该方式获取MAC时有一个很大的限制,就是只能获取同网段的远程主机MAC地址.因为在标准网络协议下,ARP包是不能跨网段传输的,故想通过ARP协议是无法查询跨网段设备MAC地址的。
示例程序:
注:在Visual Studio 2008中,可能会出现: 找不到类型或命名空间名称“ManagementObjectSearcher”(是否缺少 using 指令或程序集引用?) 类似的错误提示。出现这种错误的原因是没有添加对System.Management.Dll的引用。
解决办法:在“解决方案资源管理器”-“引用”上点击右键,选择“添加引用”,在打开的列表中选择“System.Management”,点击“确定”即可。
在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.
示例:
string strHostName = Dns.GetHostName(); //得到本机的主机名 IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP string strAddr = ipEntry.AddressList[0].ToString(); //假设本地主机为单网卡
在这段代码中使用了两个类,一个是Dns类,另一个为IPHostEntry类,二者都存在于命名空间System.Net中.
Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上面的代码第一行就从本地的DNS中检索出本地主机名.
IPHostEntry类则将一个域名系统或主机名与一组IP地址相关联,它与DNS类一起使用,用于获取主机的IP地址组.
要获取远程主机的IP地址,其方法也是大同小异.
在获取了IP地址后,如果还需要取得网卡的MAC地址,就需要进一步探究了.
这里又分两种情况,一是本机MAC地址,二是远程主机MAC地址.二者的获取是完全不同的.
在获取本机的MAC地址时,可以使用WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中.
ManagementObjectSearcher类用于根据指定的查询检索管理对象的集合
ManagementObjectCollection类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它.
示例:
ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ; ManagementObjectCollection queryCollection = query.Get(); foreach( ManagementObject mo in queryCollection ) { if(mo["IPEnabled"].ToString() == "True") mac = mo["MacAddress"].ToString(); }
获取远程主机的MAC地址时,需要借用API函数SendARP.该函数使用ARP协议,向目的主机发送ARP包,利用返回并存储在高速缓存中的IP和MAC地址对,从而获取远程主机的MAC地址.
示例:
Int32 ldest= inet_addr(remoteIP); //目的ip Int32 lhost= inet_addr(localIP); //本地ip try { Int64 macinfo = new Int64(); Int32 len = 6; int res = SendARP(ldest,0, ref macinfo, ref len); //发送ARP包 return Convert.ToString(macinfo,16); } catch(Exception err) { Console.WriteLine("Error:{0}",err.Message); } return 0.ToString();
但使用该方式获取MAC时有一个很大的限制,就是只能获取同网段的远程主机MAC地址.因为在标准网络协议下,ARP包是不能跨网段传输的,故想通过ARP协议是无法查询跨网段设备MAC地址的。
示例程序:
using System.Net; using System; using System.Management; using System.Runtime.InteropServices; namespace ConsoleApplication2 { public class Program { [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); //获取本机的IP public string getLocalIP() { string strHostName = Dns.GetHostName(); //得到本机的主机名 IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP string strAddr = ipEntry.AddressList[0].ToString(); return (strAddr); } //获取本机的MAC public string getLocalMac() { string mac = null; //[DllImport("System.Management.dll")] ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration"); ManagementObjectCollection queryCollection = query.Get(); foreach (ManagementObject mo in queryCollection) { if (mo["IPEnabled"].ToString() == "True") mac = mo["MacAddress"].ToString(); } return (mac); } //获取远程主机IP public string[] getRemoteIP(string RemoteHostName) { IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName); IPAddress[] IpAddr = ipEntry.AddressList; string[] strAddr = new string[IpAddr.Length]; for (int i=0;i<strAddr.Length;i++) { strAddr[i] = IpAddr[i].ToString(); } return(strAddr); } //获取远程主机MAC public string getRemoteMac(string localIP, string remoteIP) { Int32 ldest = inet_addr(remoteIP); //目的ip Int32 lhost = inet_addr(localIP); //本地ip try { Int64 macinfo = new Int64(); Int32 len = 6; int res = SendARP(ldest,0, ref macinfo, ref len); string macnum = Convert.ToString(macinfo, 16);//16进制的Mac地址数据 string[] macArr = new string[macnum.Length]; string macaddr=""; for (int i = 0; i < (macnum.Length/2); i++) { macArr[i] = macnum[macnum.Length - 2*(i+1)].ToString()+macnum[macnum.Length-2*i-1].ToString();//将Mac地址顺序转置 } for (int j=0; j< 6;j++) { if(j==0) { macaddr = macArr[0].ToString(); } else { macaddr = macaddr+":"+macArr[j].ToString(); } } return macaddr; } catch (Exception err) { Console.WriteLine("Error:{0}", err.Message); } return "无法获得MAC地址"; } public static void Main(string[] args) { Program gi = new Program(); Console.WriteLine("本地网卡信息:"); Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac()); Console.WriteLine("/n/r远程设备的网卡信息:"); string[] temp = gi.getRemoteIP("MyComputer");//远程设备的Host名称 for(int i=0;i<temp.Length;i++) { Console.WriteLine(temp[i]); } Console.WriteLine("/n/r远程设备的Mac信息:"); string DeviIP = "192.168.0.5";//远程设备的IP地址 Console.WriteLine(gi.getRemoteMac(gi.getLocalIP(), DeviIP)); Console.ReadKey(); } } }
注:在Visual Studio 2008中,可能会出现: 找不到类型或命名空间名称“ManagementObjectSearcher”(是否缺少 using 指令或程序集引用?) 类似的错误提示。出现这种错误的原因是没有添加对System.Management.Dll的引用。
解决办法:在“解决方案资源管理器”-“引用”上点击右键,选择“添加引用”,在打开的列表中选择“System.Management”,点击“确定”即可。
相关文章推荐
- C# 如何获得电脑的Mac地址
- 如何根据MAC地址获取设备厂商
- Linux下如何获取网络设备MAC地址
- 获得MAC地址的四个方法
- .net如何获得前一页面的地址
- 如何在Windows 2000下修改MAC地址
- java 获得网卡MAC地址
- Mac OS X 下如何把网页挂到服务器以供局域网内的设备访问
- 如何使用Python读取物理地址MAC ID
- 根据设备定位所得的经纬度,获得具体的地址
- 如何获取本机所有MAC地址
- 如何修改网卡的MAC(物理)地址
- CISCO交换机中如何绑定IP与MAC地址
- 获得MAC地址的四个方法
- 如何用VC++开发读取网卡MAC地址的程序
- 如何用VC++开发读取网卡MAC地址的程序
- 如何修改本机MAC地址
- 如何禁止 Mac OS X 在外接设备上生成 .DS_Store 文件?以及如何批量删除 .DS_Store 文件?
- 解决 “eth0 设备的 MAC 地址与预想的不符,忽略” 问题