Как программно определить тип шифра и уровень шифрования от беспроводного сетевого устройства с сервера Windows 2003 - PullRequest
5 голосов
/ 22 апреля 2010

Теперь моя команда работает в сетевом проекте, используя приложение для Windows c # .Я не знал, как программно определить тип шифра и уровень шифрования с беспроводного сетевого устройства с сервера Windows 2003.

После поиска я получил WMI (Windows ManagementИнструментарий) для решения проблемы. +

Пожалуйста, предложите пример / ссылку для поиска типа шифра и уровня шифрования от устройства беспроводной сети от Windows 2003 Server

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

только что нашел ваш вопрос. Информация, которую вы ищете, происходит из драйвера 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 также может быть хорошей прагматической альтернативой.

2 голосов
/ 25 апреля 2010

Что касается WMI, вы довольно ограничены в информации о беспроводном соединении, которую вы можете получить.

Выполнение запроса WMI для "Select * from MSNdis_80211_WEPStatus where active=true" должно дать числовой результат, где:

0=WEP is in use
2=Connection is unsecured
4=WPA-PSK is in use
6=WPA is in use
7=Disconnected

Чтобы выполнить этот запрос из powershell, вы можете просто сделать:

PS C: \ WINDOWS> gwmi -query "Select * from MSNdis_80211_WEPStatus where active=true" -namespace root\wmi

Из C # должно работать следующее:

using System;
using System.Management;
class Query_SelectQuery
{
    public static int Main(string[] args) 
    {
        SelectQuery selectQuery = new 
            SelectQuery("Select * from MSNdis_80211_WEPStatus where active=true");
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\wmi", selectQuery);

        foreach (ManagementObject resultVal in searcher.Get()) 
        {
            Console.WriteLine(resultVal.ToString());
        }

        Console.ReadLine();
        return 0;
    }
}

Если у вас есть несколько активных беспроводных подключений, это усложняется, потому что вам нужно получить значения SSID путем запроса свойства Ndis80211Ssid в классе MSNdis_80211_ServiceSetIdentifier.

Если бы вы работали в Windows {Vista, 7, Server 2008}, вы могли бы запустить netsh wlan export из командной оболочки и заставить его выводить хороший XML-файл с вашими сетевыми настройками (не включая ключ беспроводной сети), но я не Не думаю, что есть какой-то способ заставить это работать на Windows XP, Server 2003 или других незарегистрированных операционных системах.

Другой вариант, если вам нужна более подробная информация о конфигурации, особенно в Windows 2003 Server, - это доступ к параметрам групповой политики, как подробно описано в этой статье: http://technet.microsoft.com/en-us/library/bb878079.aspx

У меня нет машины под управлением Windows Server 2003, с которой можно тестировать, но вы должны иметь возможность доступа к этим объектам и настройкам групповой политики через WMI в пространстве имен root \ RSoP

Запуск wbemtest из консоли или использование инструмента Microsoft WMI Code Creator позволит вам просмотреть доступные объекты и классы WMI, чтобы точно определить, где находятся эти объекты групповой политики.

Запросы для объектов WMI групповой политики выглядит довольно болезненно, хотя: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...