GetAdaptersAddresses是Windows下获取MAC地址最稳定的方式,需传AF_UNSPEC、两次调用处理缓冲区、遍历链表检查PhysicalAddressLength==6且非全零,链接Iphlpapi.lib。

GetAdaptersAddresses 能拿到 MAC,但得先选对地址族
Windows 下最稳定的方式是调用 GetAdaptersAddresses,但它不是“一调就出 MAC”的函数——必须传入 AF_UNSPEC 或 AF_INET,不能传 AF_INET6 单独用,否则部分网卡(尤其是只启用 IPv6 的虚拟适配器)会漏掉。实际中建议固定用 AF_UNSPEC,再遍历结果里的 PhysicalAddress 字段。
常见错误是传 AF_INET 后发现 Hyper-V、WSL2 的 vEthernet 适配器没数据,其实是因为这些适配器默认不参与 IPv4 栈,但物理地址依然存在。
- 调用前必须链接
Iphlpapi.lib - 缓冲区大小初始设为 0,靠返回的
SizePointer值重分配内存,别硬写 8KB -
Adapter->PhysicalAddressLength为 0 表示该适配器无 MAC(如拨号、隧道接口),跳过即可
getifaddrs 在 MinGW/MSYS2 下不可用,别被 man 手册误导
Linux 上惯用的 getifaddrs 在 Windows 官方 MSVC 工具链里根本不存在,MinGW-w64 的头文件可能声明了它,但链接时会报 undefined reference to `getifaddrs'。这不是你没加库,是 Windows 系统 DLL 就没导出这个符号。
如果你在跨平台项目里写了条件编译,记得 Windows 分支必须走 GetAdaptersAddresses,而不是指望 MinGW 兼容 POSIX 接口。
- MSVC + Windows SDK ≥ 6.0:只认
GetAdaptersAddresses - Clang-cl / MinGW-w64:仍需用
GetAdaptersAddresses,getifaddrs是 stub - 想用类 POSIX 风格?考虑第三方库如
libpcap,但引入依赖得权衡
SO_BINDTODEVICE 不是获取 MAC 的手段,别混淆用途
有人看到 socket 选项 SO_BINDTODEVICE 就以为能反查 MAC,其实 Windows 根本不支持这个选项(setsockopt 直接返回 WSAENOPROTOOPT)。Linux 下它也只是绑定发包出口设备名,和读取硬件地址无关。
Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。
真正通过 socket 摸到 MAC 的唯一可行路径是:用 socket(AF_PACKET, SOCK_RAW, ...) 抓包后解析以太网帧头——但这需要管理员权限、驱动支持(如 Npcap),且完全脱离“获取本机配置”的语义,属于旁路探测。
-
SO_BINDTODEVICE在 Windows 上无效,别浪费时间试 - 用 raw socket 解析帧头 → 只适用于调试或抓包工具,不适合配置管理场景
- 若只是要 MAC 写进日志或 license 绑定,
GetAdaptersAddresses足够且安全
注意 Loopback 和 Disconnected 状态下的 PhysicalAddress
环回适配器(Loopback Pseudo-Interface)的 PhysicalAddress 是全零(6 字节 00-00-00-00-00-00),不是错;而已拔网线但驱动仍在的有线网卡,OperStatus 是 IfOperStatusDown,但 PhysicalAddress 依然有效——MAC 地址是烧录在硬件里的,和连接状态无关。
容易踩坑的是按 OperStatus == IfOperStatusUp 过滤,结果把离线但需识别的网卡(比如待唤醒的远程管理口)给筛掉了。
- 判断是否“可用”取决于业务:license 绑定通常要所有非零 MAC;监控系统可能只关心 Up 的接口
- 过滤名称含
"Loopback"或"Microsoft KM-TEST"的适配器,避免干扰 - MAC 字节数组转字符串时,用
sprintf_s(buf, "%02X-%02X-%02X-%02X-%02X-%02X", ...),别用小写 x,Windows 注册表和多数工具认大写
实际用起来,最简健壮路径就是:调一次 GetAdaptersAddresses,遍历 IP_ADAPTER_ADDRESSES 链表,检查 PhysicalAddressLength == 6 且内容非全零,再按需过滤名称或状态。别的路子要么不可靠,要么过度复杂。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










