только что нашел ваш вопрос. Информация, которую вы ищете, происходит из драйвера NDIS. WMI только дает вам подмножество такой информации. Каждый драйвер NDIS поддерживает некоторые стандартные запросы, которые можно отправлять в отношении функции DeviceIoControl
(см. http://msdn.microsoft.com/en-us/library/aa363216%28v=VS.85%29.aspx).). В качестве ввода (параметр lpInBuffer) следует указать DWORD с кодом OID, управляющим кодом, который идентифицирует запрос. , В качестве вывода вы получаете структуру с сохраненной информацией или, в вашем случае, DWORD (enum-значение). Например, если вы запросили драйвер NDIS для
#define OID_802_11_WEP_STATUS 0x0D01011B
(в качестве значения DWORD параметра lpInBuffer) возвращается также DWORD с информацией типа
// Also aliased typedef to new name
typedef enum _NDIS_802_11_WEP_STATUS
{
Ndis802_11WEPEnabled,
Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
Ndis802_11WEPDisabled,
Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
Ndis802_11WEPKeyAbsent,
Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
Ndis802_11WEPNotSupported,
Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
Ndis802_11Encryption2Enabled,
Ndis802_11Encryption2KeyAbsent,
Ndis802_11Encryption3Enabled,
Ndis802_11Encryption3KeyAbsent
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
запрос на
#define OID_802_11_AUTHENTICATION_MODE 0x0D010118
возвращает
typedef enum _NDIS_802_11_AUTHENTICATION_MODE
{
Ndis802_11AuthModeOpen,
Ndis802_11AuthModeShared,
Ndis802_11AuthModeAutoSwitch,
Ndis802_11AuthModeWPA,
Ndis802_11AuthModeWPAPSK,
Ndis802_11AuthModeWPANone,
Ndis802_11AuthModeWPA2,
Ndis802_11AuthModeWPA2PSK,
Ndis802_11AuthModeMax // Not a real mode, defined as upper bound
} NDIS_802_11_AUTHENTICATION_MODE;
запрос на
#define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
возвращает
typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
{
Ndis802_11IBSS,
Ndis802_11Infrastructure,
Ndis802_11AutoUnknown,
Ndis802_11InfrastructureMax // Not a real value, defined as upper bound
} NDIS_802_11_NETWORK_INFRASTRUCTURE;
и так далее. Вы можете найти все необходимые вам константы в ntddndis.h
после установки Windows DDK.
Чтобы открыть дескриптор устройства, вы должны использовать функцию CreateFile
. Вместо имени файла вы должны указать строку с префиксом "\\.\"
и именем адаптера (руководства по адаптеру). Названия адаптеров вы можете перечислить другим способом. Одним из самых простых является имя подраздела раздела реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters
.
Все, что я объяснил выше, работает точно так же, как http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx или другие примеры использования DeviceIoControl
. Полный список запросов IoControl, которые должны поддерживать некоторый класс устройств, описан в DDK. Еще раз повторяю, что для его использования нужно всего лишь использовать DeviceIoControl
, а не писать драйвер устройства.
Еще 10 лет назад я немного поиграл с такими просьбами, которые я здесь описал. Я проверил мою старую программу работает без проблем сейчас. Нужно использовать только те OID, которые вам нужны, и не намного больше.
ОБНОВЛЕНО: Я нашел хорошую ссылку http://pages.infinit.net/codeguru/WiFiArticle.htm, которая другими словами объясняет то же самое, что я только что написал. Мне кажется, что здесь используются неправильные параметры в CreateFile
. Нужно использовать FILE_SHARE_READ | FILE_SHARE_WRITE
, чтобы все заработало. Пример http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp (см. bool WindowsWiFiUtils:init()
, bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode)
и т. Д.) Выглядит намного лучше и содержит множество методов, которые также могут быть вам интересны. Это пример C ++, но это очень легко переписать в C #.
ОБНОВЛЕНО 2: Еще одним способом является использование «Native Wifi API» http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx, например, WlanQueryInterface (например, с wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs) или WZCQueryInterface, но, похоже, не поддерживается в Windows 2003 что вам нужно. Обычно «Native Wifi API», вероятно, является более надежным способом предоставления максимальной информации (или ее изменения), но WMI также может быть хорошей прагматической альтернативой.