C#如何获得设备Mac地址之欧阳结创编.docx
- 文档编号:6888221
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:6
- 大小:17.13KB
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;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 创作: 欧阳结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 如何 获得 设备 Mac 地址 欧阳 创编