Получить MAC-адреса беспроводных адаптеров в C++ на WinXP и выше
Я хотел бы иметь выше. Я нашел IP Helper API, и он работает. Единственная проблема заключается в том, что в системах старше Vista я не могу определить, является ли адаптер беспроводным или обычным Ethernet. Мне также нужно поддерживать WinXP и Server 2003.
Вот соответствующая цитата из документации ( IP Helper):
Интерфейс беспроводной сети IEEE 802.11. Примечание. Этот тип адаптера возвращается в Windows Vista и более поздних версиях. В Windows Server 2003 и>Windows XP интерфейс беспроводной сети IEEE 802.11 возвращает тип адаптера>MIB_IF_TYPE_ETHERNET.
Итак, что является хорошим способом идентифицировать беспроводные адаптеры и получить их MAC-адреса на WinXP/Server2003 и позже?
2 ответа
Если вы собираетесь поддерживать XP с нуля, это произошло до того, как API-интерфейс Native Wifi был представлен в XP (SP 2 и 3 поддерживают API-интерфейс Native Wifi).
Я думаю, что все еще может быть возможность через WMI. Вы могли бы создать Win32_NetworkAdapter
(Устаревший класс WMI) В этом классе вы должны быть в состоянии извлечь AdapterTypeID
который говорит, является ли это беспроводное устройство или нет, и MACAddress
который дает вам MAC-адрес.
Поэтому я думаю, что вы выбрали либо поддержку Windows XP SP 2 и выше, либо интеграцию с WMI и устаревшим классом. Похоже, в любом случае есть верблюды, которых можно проглотить.
GetAdapterAddresses является частью API Windows и должен предоставить вам как информацию о MAC-адресах, так и тип NIC.
Вызов возвращает структуру, указывающую на связанный список адаптеров.
Убедитесь, что вы не жестко задаете размер структуры для обеспечения переносимости между версиями Windows, потому что IP_ADAPTER_ADDRESSES
структура изменилась размер между версиями.
Редактировать:
Это, очевидно, только даст вам MAC-адрес, так как он сообщает только правильный тип после Vista
Но GetIfTable возвращает MIB_IFTABLE
структура, из этого вы можете прочитать MIB_IFROW
который имеет dwType, который может иметь тип IF_TYPE_IEEE80211 или нет. Здесь нет замечаний, что это особенно для Vista и должно быть действительно для XP, если MS не испортила их документацию.
У обоих из них должен быть физический адрес, поэтому вы должны быть в состоянии сопоставить эти две записи, чтобы идентифицировать одну карту.