出自: http://blog.joycode.com/liuhuimiao/

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

不应该用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地址的。

如何获得System.Management?
引用下 System.Management 这个.net组件就行了.
提示: 类型或命名空间名称“Management”在类或命名空间“System”中不存在(是否缺少程序集引用?)——怎么回事?
“添加引用”-->“.NET组件”-->找到System.Management.dll组件。按引用即可拉。

获取远程网卡MAC地址相关推荐

  1. 获取客户端网卡MAC地址和IP地址的几种方法(一)

    获取客户端网卡MAC地址和IP地址的几种方法(一) 作者:代码乱了 在做B/S结构的系统时,我们常常需要获取客户端的一些信息,如IP和MAC,以结合身份验证.在ASP.NET中,要获取服务器端的MAC ...

  2. android 获取网卡mac_在Android机顶盒上 怎么样获取有线网卡MAC地址?

    先关闭wifi,在运行以下java代码: 获取当前连接网络的网卡的mac地址 private static String parseByte(byte b) { String s = "00 ...

  3. linux得到网卡mac地址,获取 linux 网卡MAC地址(包含编程方法)

    网卡在计算机专业词汇里面被叫做 network interface 如果检索资料可以用这个词汇 常用的几种办法 ip link show cat /sys/class/net//address 使用 ...

  4. 网卡MAC地址相关信息大全

    原文链接:http://blog.csdn.net/piggyxp/article/details/170250 首先要感谢jzyhummel(刀锋[篱影]) 兄弟提供的部分资料^_^ 网卡地址这个概 ...

  5. 网卡MAC地址相关信息大全(整理)(下)

    如何实现修改网卡物理地址的三种方法 同样要感谢胡大虾 1.买一块可以通过写eeprom物理的修改网卡地址,这种卡现在 很多,并非买不到.如果环境中需要应用网络,那么修改MAC地址, 使得两块卡的MAC ...

  6. android 获取mac c语言,获取设备的mac地址和IP地址(android6.0以上专用)

    /** * 获取设备HardwareAddress地址 * @return */ public static String getMachineHardwareAddress(){ Enumerati ...

  7. 关于wmi获取网卡mac地址重复的分析

    现象:如图在部分电脑上获取ip和MAC地址对应关系时,界面显示部分电脑发现重复ip和mac 分析:用WMI Explorer查看时,有一个设备Microsoft TV/video connection ...

  8. Delphi自定义获取网卡MAC地址过程

    //获取网卡MAC地址=============================================================== procedure CvtInt; asm     ...

  9. Python获取电脑硬件配置的封装类,可以获取CPU序列号、主板序列号、BIOS序列号、硬盘序列号和网卡MAC地址

    Python获取电脑硬件配置的封装类,可以获取CPU序列号.主板序列号.BIOS序列号.硬盘序列号和网卡MAC地址. myPyHardware.py # -*- coding: utf-8 -*- i ...

最新文章

  1. 全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
  2. 「AI白身境」入行AI需要什么数学基础:左手矩阵论,右手微积分
  3. Node.js使用NodeMailer发送邮件
  4. The following packages have been kept back
  5. mysql 支持 pdo_使php支持pdo_mysql_睿合科技
  6. Codeforces 1196D RGB Substring
  7. nodejs 游戏框架_nodejs游戏服务器框架
  8. P2801-教主的魔法【分块,二分】
  9. 关于 CFileDialog 对话框多选功能的一个问题
  10. 企业实战03:Oracle数据库_用户和表空间
  11. STM32 4*4矩阵按键
  12. 给fiddle 解密_fiddler学习笔记2 字段说明;移动设备、解密证书
  13. XCL-Charts圈图
  14. [转载] Python中关于字符串的使用演示
  15. Greenplum 数据库一体机硬件配置正式开源
  16. Android 使用 aria2c + 百度网盘助手下载百度云文件
  17. 关于各式竞赛书籍的点评
  18. c语言入门ppt演示,c语言学习ppt-C语言入门教程ppt(共434页)免费版【精品课件】-东坡下载...
  19. 计算机管理的事件id,事件查看器7035是什么意思_windows事件查看器常见ID代码含义详解...
  20. 使用Druid SQL Parser解析SQL

热门文章

  1. android 可折叠标题栏,ViewPager + Fragment + 折叠式标题栏异常
  2. php yii2支付宝开发,yii2 支付宝支付教程 [ 2.0 版本 ]
  3. android gdb 命令大全,ndk-gdb  |  Android NDK  |  Android Developers
  4. 使用Python和OpenCV进行拍摄截图
  5. 使用Java对轨迹进行抽稀,并生成mvt(Map Vector Tile)瓦片
  6. Linux那些事儿之我是Sysfs(5)举例二sculld
  7. 办公计算机培训方案,计算机办公软件应用培训教学计划规划方案.docx
  8. msdn画圆弧函数_复变函数与积分变换 简明笔记(八):保形映射(共形映射)
  9. SSC:基于点云语义上下文的大规模激光SLAM的位置识别方法
  10. 设置VSCode显示聚焦到资源管理器NPM窗口快捷键Alt+N