C#如何获得设备Mac地址之欧阳结创编.docx
《C#如何获得设备Mac地址之欧阳结创编.docx》由会员分享,可在线阅读,更多相关《C#如何获得设备Mac地址之欧阳结创编.docx(6页珍藏版)》请在冰豆网上搜索。
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;i42. {
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;i91. {
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
创作:
欧阳结