Получить 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 не испортила их документацию.

У обоих из них должен быть физический адрес, поэтому вы должны быть в состоянии сопоставить эти две записи, чтобы идентифицировать одну карту.

Другие вопросы по тегам