获取远程网卡MAC地址
朋友mingal急問我有關獲取遠程網卡MAC地址的ASP.net實現。我一開始以為是獲取本機MAC地址,說了幾種方法給他。由于他還需要獲取服務器(本機)相關信息,如硬盤序列號、CPU信息等。于是介紹了個WMI方法給他:
using System.Management;
string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
???
foreach(ManagementObject mo in moc)
{
???? if ((bool)mo["IPEnabled"] == true)
?? ? {
???? ?strMac += mo["MacAddress"].ToString() + "
";
???? }
}
??? 后來才知道他要的是局域網瀏覽用戶的網卡的MAC地址,那可犯難了。后來找到了相關實現代碼,大致是使用地址轉換協議進行廣播查詢的,主要是SendArp這個API:
DWORD SendARP(
? IPAddr DestIP,???? // 目的IP 地址
? IPAddr SrcIP,????? // 源IP地址,可選參數,把它填成0不會有問題
? PULONG pMacAddr,?? // 返回的物理地址
? PULONG PhyAddrLen? // 物理地址的長度
);
在C#中實現為:
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
private IntPtr getRemoteMAC(string localIP, string remoteIP)
{
?? ??Int32 ldest= inet_addr(remoteIP);? //目的地的ip
??? ?Int32 lhost= inet_addr(localIP);???? ?//本地服務器的ip
???try
???{
???? ?Byte[] macinfo=new Byte[6];
??? ??IntPtr mac=new IntPtr(macinfo[0]);
???? ?IntPtr len=new IntPtr;
??????int ii=SendARP(ldest,lhost, ref mac, ref len);
???? ?return mac;
???}
???catch(Exception err)
???{
???}
???? ?return IntPtr.Zero;
}
??? 可是當把得到的IntPtr類型的MAC地址轉換為十六進制時,出現了令人不解的一幕。比如我的網卡MAC地址為00-50-BA-29-22-1A,可是轉換后的十六進制卻是29BA5000。顯然是要每兩位反過來排序,但是為什么卻缺少了 22-1A ?按道理說得到的結果應該是1A2229BA5000。另外,Arp只能獲得同一個網段的,不能跨網段!郁悶ing……,有什么更好的方法???
下面修改過的C#代碼已驗證通過(未將網絡字節順序轉換為主機字節順序):
[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);
static private Int64 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);
return macinfo;
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0;
}
至于第二個問題,在標準網絡協議下,ARP包是不可能跨網段傳輸的,故想通
過ARP協議是無法查詢跨網段設備MAC地址的。
引用下 System.Management 這個.net組件就行了.
提示: 類型或命名空間名稱“Management”在類或命名空間“System”中不存在(是否缺少程序集引用?)——怎么回事?
“添加引用”-->“.NET組件”-->找到System.Management.dll組件。按引用即可拉。
總結
以上是生活随笔為你收集整理的获取远程网卡MAC地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.0中获取数据库连接统计数据
- 下一篇: input type右对齐与只读的