在 WinXP 及更高版本的 C++ 中获取无线适配器的 MAC 地址

get mac addresses of wireless adapters in c++ on WinXP and above

提问人:michaelr524 提问时间:2/19/2013 更新时间:2/20/2013 访问量:2671

问:

我想要以上。 我找到了 IP Helper API,它可以工作。唯一的问题是,在早于Vista的系统上,我无法识别适配器是无线的还是常规以太网的。 我还需要支持 WinXP 和 Server 2003。

以下是文档(IP Helper)中的相关引用:

IEEE 802.11 无线网络接口。 注意:在 Windows Vista 及更高版本上返回此适配器类型。在 Windows Server 2003 和 >Windows XP 上,IEEE 802.11 无线网络接口返回适配器类型 >MIB_IF_TYPE_ETHERNET。

那么,在 WinXP/Server2003 及更高版本上识别无线适配器并获取其 MAC 地址的好方法是什么?

C++ Windows 无线 IPHelper

评论

0赞 daramarak 2/20/2013
Windows XP SP1 之前版本?或者 SP2-3 是有效的目标?

答:

0赞 daramarak 2/19/2013 #1

GetAdapterAddresses 是 Windows API 的一部分,应提供有关 mac 地址和 NIC 类型的信息。

调用返回指向适配器链表的结构。

请确保不要对结构的大小进行硬编码以保持 Windows 版本之间的可移植性,因为结构在版本之间更改了大小。IP_ADAPTER_ADDRESSES

编辑:

这显然只给你mac地址,因为它只在Vista之后报告正确的类型

但是,GetIfTable 返回一个结构,从中可以读取具有 dwType 的结构,该结构可能不是 IF_TYPE_IEEE80211 类型。这没有说明这对 Vista 来说是特别的,并且应该对 XP 有效,除非 MS 搞砸了他们的文档。MIB_IFTABLEMIB_IFROW

这两个卡都应该有一个物理地址,因此您应该能够匹配这两个条目以识别一张卡。

评论

1赞 michaelr524 2/19/2013
这个功能也有同样的问题,我不知道它是无线适配器还是普通适配器。来自文档:IEEE 802.11 无线网络接口。在 Windows Vista 及更高版本上,无线网卡报告为IF_TYPE_IEEE80211。在早期版本的 Windows 上,无线网卡报告为IF_TYPE_ETHERNET_CSMACD。在安装了 Windows XP SP2 的 Windows XP SP3 和安装了 Windows XP SP2 无线 LAN API 的 Windows XP SP2 x86 上,WlanEnumInterfaces 函数可用于枚举本地计算机上的无线接口。
0赞 daramarak 2/19/2013
@michaelr524我挖得更深,希望这会有所帮助。
0赞 michaelr524 2/19/2013
感谢您的挖掘:)在我接受你的答案之前,我必须测试你的假设。
0赞 michaelr524 2/19/2013
好吧,我测试了它,所有的无线适配器都以以太网的形式出现。太糟糕了。
0赞 daramarak 2/20/2013
好吧,让我的答案暂时搁置。所以任何人都可以知道什么对你不起作用。不过我会继续寻找。
0赞 daramarak 2/20/2013 #2

如果您打算从头开始支持XP,那么这是在将Native Wifi API引入XP之前(SP 2和3支持Native Wifi API)。

我认为通过WMI仍然可能有机会。您也许能够创建一个Win32_NetworkAdapter(已弃用的 WMI 类) 在此类中,您应该能够提取它来判断它是否是无线设备,并为您提供 MAC 地址。AdapterTypeIDMACAddress

因此,我认为您的选择是支持 Windows XP SP 2 及更高版本,或者必须与 WMI 和已弃用的类集成。看起来无论如何都有骆驼可以吞下。

评论

0赞 michaelr524 2/21/2013
在 Windows 7 上尝试了 WMI,wifi 适配器被报告为以太网 802.3,所以我想它不起作用。这是我用来测试它的脚本:strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter") For Each objItem in colItems Wscript.Echo "Name: " & objItem.Name Wscript.Echo "Description: " & objItem.Description Wscript.Echo "MACAddress: " & objItem.MACAddress Wscript.Echo "AdapterType: " & objItem.AdapterType Next