有什么办法可以获得浏览者的MAC地址

letforme 2004-10-29 04:21:53
RT
...全文
326 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
letforme 2004-10-30
  • 打赏
  • 举报
回复
顶~~~~~~没人答啊
letforme 2004-10-29
  • 打赏
  • 举报
回复
有人帮我把一楼的c#改为vb语法吗.........
zhn0410 2004-10-29
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/33/33303.shtm
zhn0410 2004-10-29
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/36/36854.shtm
zhn0410 2004-10-29
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/44/44795.shtm
rickjelly2004 2004-10-29
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3278/3278237.xml?temp=.4232904
xiaohutushen 2004-10-29
  • 打赏
  • 举报
回复
获取远程网卡MAC地址

获取远程网卡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……,有什么更好的方法???
Tuesday, December 23, 2003 3:01 PM

反馈
# 回复: 获取远程网卡MAC地址 12/23/2003 10:55 PM backend
不应该用IntPtr的。通过它只能访问到Int32(在32位平台上)大小的内容。
下面修改过的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地址的。


///////////////////////////////



62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧