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……,有什么更好的方法???