C#如何获得设备Mac地址之欧阳结创编.docx

上传人:b****6 文档编号:6888221 上传时间:2023-01-12 格式:DOCX 页数:6 大小:17.13KB
下载 相关 举报
C#如何获得设备Mac地址之欧阳结创编.docx_第1页
第1页 / 共6页
C#如何获得设备Mac地址之欧阳结创编.docx_第2页
第2页 / 共6页
C#如何获得设备Mac地址之欧阳结创编.docx_第3页
第3页 / 共6页
C#如何获得设备Mac地址之欧阳结创编.docx_第4页
第4页 / 共6页
C#如何获得设备Mac地址之欧阳结创编.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

C#如何获得设备Mac地址之欧阳结创编.docx

《C#如何获得设备Mac地址之欧阳结创编.docx》由会员分享,可在线阅读,更多相关《C#如何获得设备Mac地址之欧阳结创编.docx(6页珍藏版)》请在冰豆网上搜索。

C#如何获得设备Mac地址之欧阳结创编.docx

C#如何获得设备Mac地址之欧阳结创编

C#如何获得设备Mac地址

时间:

2021.02.14

创作:

欧阳结

利用dns类和WMI规范获取IP及MAC地址

在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.

示例:

[c-sharp]viewplaincopy

1.string strHostName = Dns.GetHostName(); //得到本机的主机名  

2.IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP  

3.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类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它.

示例:

[c-sharp]viewplaincopy

1.ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;  

2.ManagementObjectCollection queryCollection = query.Get();  

3.foreach( ManagementObject mo in queryCollection )   

4.{   

5.   if(mo["IPEnabled"].ToString() == "True")  

6.   mac = mo["MacAddress"].ToString();  

7.}  

获取远程主机的MAC地址时,需要借用API函数SendARP.该函数使用ARP协议,向目的主机发送ARP包,利用返回并存储在高速缓存中的IP和MAC地址对,从而获取远程主机的MAC地址.

示例:

[c-sharp]viewplaincopy

1.Int32 ldest= inet_addr(remoteIP); //目的ip   

2.Int32 lhost= inet_addr(localIP); //本地ip   

3.try   

4.{   

5.   Int64 macinfo = new Int64();   

6.   Int32 len = 6;   

7.   int res = SendARP(ldest,0, ref macinfo, ref len); //发送ARP包  

8.   return Convert.ToString(macinfo,16);   

9.}   

10.catch(Exception err)   

11.{   

12.   Console.WriteLine("Error:

{0}",err.Message);   

13.}   

14.return 0.ToString();  

但使用该方式获取MAC时有一个很大的限制,就是只能获取同网段的远程主机MAC地址.因为在标准网络协议下,ARP包是不能跨网段传输的,故想通过ARP协议是无法查询跨网段设备MAC地址的。

示例程序:

[c-sharp]viewplaincopy

1.using System.Net;  

2.using System;  

3.using System.Management;  

4.using System.Runtime.InteropServices;  

5.namespace ConsoleApplication2  

6.{  

7.    public class Program  

8.    {  

9.        [DllImport("Iphlpapi.dll")]  

10.        private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);  

11.        [DllImport("Ws2_32.dll")]  

12.        private static extern Int32 inet_addr(string ip);  

13.        //获取本机的IP  

14.        public string getLocalIP()  

15.        {  

16.            string strHostName = Dns.GetHostName(); //得到本机的主机名  

17.            IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP  

18.            string strAddr = ipEntry.AddressList[0].ToString();  

19.            return (strAddr);  

20.        }  

21.        //获取本机的MAC  

22.        public string getLocalMac()  

23.        {  

24.            string mac = null;  

25.            //[DllImport("System.Management.dll")]  

26.            ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");  

27.            ManagementObjectCollection queryCollection = query.Get();  

28.            foreach (ManagementObject mo in queryCollection)  

29.            {  

30.                if (mo["IPEnabled"].ToString() == "True")  

31.                    mac = mo["MacAddress"].ToString();  

32.            }  

33.            return (mac);  

34.        }  

35.        //获取远程主机IP  

36.        public string[] getRemoteIP(string RemoteHostName)  

37.       {  

38.        IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName);  

39.        IPAddress[] IpAddr = ipEntry.AddressList;  

40.        string[] strAddr = new string[IpAddr.Length];  

41.        for (int i=0;i

42.        {  

43.         strAddr[i] = IpAddr[i].ToString();  

44.        }  

45.        return(strAddr);  

46.       }  

47.        //获取远程主机MAC  

48.        public string getRemoteMac(string localIP, string remoteIP)  

49.        {  

50.            Int32 ldest = inet_addr(remoteIP); //目的ip   

51.            Int32 lhost = inet_addr(localIP); //本地ip   

52.            try  

53.            {  

54.                Int64 macinfo = new Int64();      

55.                Int32 len = 6;      

56.                int res = SendARP(ldest,0, ref macinfo, ref len);      

57.                string macnum = Convert.ToString(macinfo, 16);//16进制的Mac地址数据  

58.                string[] macArr = new string[macnum.Length];  

59.                string macaddr="";  

60.                for (int i = 0; i < (macnum.Length/2); i++)  

61.                {  

62.                    macArr[i] = macnum[macnum.Length - 2*(i+1)].ToString()+macnum[macnum.Length-2*i-1].ToString();//将Mac地址顺序转置  

63.                }  

64.                for (int j=0; j< 6;j++)  

65.                {  

66.                    if(j==0)  

67.                    {  

68.                        macaddr = macArr[0].ToString();  

69.                    }  

70.                    else  

71.                    {  

72.                        macaddr = macaddr+":

"+macArr[j].ToString();  

73.                    }  

74.                }  

75.                return macaddr;  

76.            }  

77.            catch (Exception err)  

78.            {  

79.                Console.WriteLine("Error:

{0}", err.Message);  

80.            }  

81.            return "无法获得MAC地址";  

82.        }  

83.        public static void Main(string[] args)  

84.       {  

85.            Program gi = new Program();  

86.            Console.WriteLine("本地网卡信息:

");  

87.            Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac());  

88.            Console.WriteLine("/n/r远程设备的网卡信息:

");  

89.            string[] temp = gi.getRemoteIP("MyComputer");//远程设备的Host名称  

90.            for(int i=0;i

91.            {  

92.                 Console.WriteLine(temp[i]);  

93.            }  

94.            Console.WriteLine("/n/r远程设备的Mac信息:

");  

95.            string DeviIP = "192.168.0.5";//远程设备的IP地址  

96.            Console.WriteLine(gi.getRemoteMac(gi.getLocalIP(), DeviIP));  

97.            Console.ReadKey();  

98.       }  

99.    }  

100.}  

注:

在VisualStudio2008中,可能会出现:

 找不到类型或命名空间名称“ManagementObjectSearcher”(是否缺少using指令或程序集引用?

) 类似的错误提示。

出现这种错误的原因是没有添加对System.Management.Dll的引用。

解决办法:

在“解决方案资源管理器”-“引用”上点击右键,选择“添加引用”,在打开的列表中选择“System.Management”,点击“确定”即可。

 

时间:

2021.02.14

创作:

欧阳结

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1