2010-04-22 5 views
5

Ahora mi equipo trabaja en un proyecto de red usando la aplicación de ventanas C#. No sabía cómo detectar mediante programación el tipo de cifrado y el nivel de cifrado desde un dispositivo de red inalámbrica desde el servidor de Windows 2003.Cómo detectar mediante programación el tipo de cifrado y el nivel de cifrado desde un dispositivo de red inalámbrico desde el servidor de Windows 2003

Después de buscar llegué WMI (Windows Management Instrumentation) para resolver el problema. +

Para sugerir ejemplo/referencia para encontrar el tipo de cifrado y el nivel de encriptación en un dispositivo de red inalámbrica de Windows 2003 Server

Respuesta

3

soporte de controlador NDIS Cada acaba de encontrar que se trate. La información que se busca para proceder de controlador NDIS. WMI sólo le da un subconjunto de dicha información. Algunas solicitudes estándar que puede se enviará con respecto a la función DeviceIoControl (consulte http://msdn.microsoft.com/en-us/library/aa363216%28v=VS.85%29.aspx). Como entrada (parámetro lpInBuffer) debe proporcionar un DWORD con un código OID, un código de control que identifique la solicitud, como resultado, recibirá una estructura con información archivada, o en su caso es un DWORD (valor enum).Por ejemplo, si se le pregunta controlador NDIS para

#define OID_802_11_WEP_STATUS     0x0D01011B 

(como valor DWORD de parámetro lpInBuffer) Devuelve la espalda también DWORD con información como

// 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; 

solicitud de

#define OID_802_11_AUTHENTICATION_MODE   0x0D010118 

vuelve

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; 

solicitud de

#define OID_802_11_INFRASTRUCTURE_MODE   0x0D010108 

vuelve

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; 

y así sucesivamente. Puede encontrar todas las constantes diferentes que necesita en ntddndis.h después de instalar Windows DDK.

Para abrir un mango de dispositivo debe utilizar la función CreateFile. En lugar del nombre del archivo, debe dar una cadena con el prefijo "\\.\" y el nombre del adaptador (guías del adaptador). Nombres de adaptador que puede enumerar de manera diferente. Uno de los más fáciles es los nombres de subclaves de la clave de registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Adapters.

Todo lo que he explicado anteriormente funciona exactamente como http://msdn.microsoft.com/en-us/library/aa964902%28v=VS.85%29.aspx u otros ejemplos de uso DeviceIoControl. La lista completa de las solicitudes de IoControl que deben admitir alguna clase de dispositivo se describe en DDK. Repito una vez más, que para el uso de eso solo necesito usar DeviceIoControl y no escribir un controlador de dispositivo.

Hace más de 10 años que juego un poco con las solicitudes que describí aquí. Probé mi antiguo programa sin problemas ahora. Uno solo necesita usar los OID que necesita y no mucho más.

ACTUALIZADO: Encontré un buen enlace http://pages.infinit.net/codeguru/WiFiArticle.htm que explica en otras palabras lo mismo que acabo de escribir. Me parece que uno usa aquí parámetros incorrectos en CreateFile. Uno tiene que usar FILE_SHARE_READ | FILE_SHARE_WRITE para que todo funcione. Ejemplo http://code.google.com/p/haggle/source/browse/winmobile/Haggle/WindowsWiFiUtils.cpp (ver bool WindowsWiFiUtils:init(), bool WindowsWiFiUtils::setEncryptionMode(unsigned long adapterIndex, const unsigned int mode) etc.) parece mucho mejor y contiene muchos métodos que también pueden ser interesantes para usted. Es un ejemplo de C++, pero es muy fácil reescribir esto en C#.

Actualización 2: una forma más es el uso de "nativo API Wifi" http://msdn.microsoft.com/en-us/library/ms706556%28VS.85%29.aspx como WlanQueryInterface (por ejemplo, con wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs) o WZCQueryInterface, pero no parece compatible con Windows Server 2003, lo que necesita. En general, "Native Wifi API" es probablemente la manera más confiable de dar la máxima información (o modificarla), pero WMI también puede ser una buena alternativa pragmática.

2

En lo que concierne a WMI, tiene bastante limitada la información de conexión inalámbrica que puede recuperar.

Ejecución de una consulta WMI para "Select * from MSNdis_80211_WEPStatus where active=true" le debe dar un resultado numérico donde:

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

para ejecutar esta consulta de PowerShell sólo tiene que hacer:

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

De C# lo siguiente debería funcionar:

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; 
    } 
} 

Si tiene varias conexiones inalámbricas activas, se vuelve más difícil porque debe obtener los valores de SSID al consultar la propiedad Ndis80211Ssid en la clase MSNdis_80211_ServiceSetIdentifier.

Si estuvo en Windows {Vista, 7, Server 2008} puede ejecutar netsh wlan export desde un shell de comandos y obtener un buen archivo .xml con su configuración de red (sin incluir la clave inalámbrica) pero no lo hago Creo que hay alguna manera de hacer que esto funcione en Windows XP, Server 2003 u otros sistemas operativos no listados.

Otra opción si necesita información de configuración más detallada específicamente en Windows Server 2003 es acceder a la configuración de directiva de grupo que se detallan en este artículo: http://technet.microsoft.com/en-us/library/bb878079.aspx

no tengo una máquina de Windows Server 2003 a mano para probar con pero usted debería ser capaz de acceder a estos objetos y la configuración de directiva de grupo a través de WMI bajo la root\RSoP namespace

Correr wbemtest desde la consola o el uso de la herramienta Microsoft WMI Code Creator le permitirá observar alrededor de los objetos y clases disponibles WMI para averiguar exactamente donde aquellos Grupo Los objetos de política mienten.

Querying for Group Policy WMI Objects se ve un poco dolorosa, aunque :(

Cuestiones relacionadas