2012-04-11 32 views
9

estoy usando WMI (Win32_NetworkAdapter) y tratando de obtener los detalles de los adaptadores de red físicos conectados ya sea por cable o inalámbrica y evitar los adaptadores virtuales, etc.Determinar Red Tipo de adaptador a través de WMI

lectura this article se explica que usted tiene para hacer algunas consultas inteligentes en WMI para eliminar adaptadores virtuales e intentar solo devolver adaptadores físicos reales.

Lectura this post explica que puede comparar el texto en la "Descripción" del adaptador de red para ver si incluye "Inalámbrico", "802.11" o "WLAN", si lo hace, entonces lo más probable es que el adaptador es un adaptador inalámbrico.

Con las versiones actuales de .Net y otros avances, ¿son estas las dos únicas formas de determinar en Windows XP + si un adaptador de red está cableado o es inalámbrico y no es un adaptador virtual del software VM o similar? Si no, por favor explique.

+0

¿Está solamente en busca de soluciones que implican WMI? –

+0

Preferiblemente, sí. Mi proyecto existente usa WMI con .Net bastante extensamente para obtener la información del adaptador tal como está. Si hay otras opciones, me gustaría saber pero no estoy seguro si implementaré. – ScottN

+0

mediante WMI no podía que acaba de filtrar en base a la 'Win32_NetworkAdapter.PhysicalAdapter' (debe ser falsa si la interfaz es virtual) y luego usar el' AdapterTypeID' para determinar si se trata de cable o inalámbrica? Revisé el artículo que publicaste y sus criterios irrazonables. –

Respuesta

1

Veo esto es una vieja pregunta, pero tengo found an answer elsewhere en Internet que da una descripción de cómo esto se puede hacer (desplazarse hasta los comentarios).

La técnica de comment-er permite la identificación de interfaces WiFi y Bluetooth, donde todos los otros tipos se pueden agrupar. Si el objetivo es solo separar el WiFi de los adaptadores Ethernet, debería ser suficiente.

Las consultas son (muestra Powershell):

$nics = Get-WmiObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_NetworkAdapter" 
$types = Get-WmiObject -Namespace "root/WMI" -Query "SELECT * FROM MSNdis_PhysicalMediumType" 

La primera consulta es el enfoque común que proporcionará la lista de adaptadores. Como se indicó anteriormente, se puede filtrar para incluir solo dispositivos físicos válidos por un número de otros criterios de selección.

La segunda consulta devuelve un objeto WMI con una propiedad NdisPhysicalMediumType, que de acuerdo con el sitio enlazado, tiene el valor para WiFi, para Bluetooth y para Ethernet y la mayoría de los otros tipos de adaptadores.

Parece que la unión de estas dos consultas debe hacerse manualmente en una secuencia de comandos utilizando la propiedad Name o Description de la primera consulta y la propiedad InstanceName de la segunda.

1

Usted puede utilizar la nueva clase WMI MSFT_NetAdapter en 'root \ StandardCimv2' espacio de nombres. Esta clase se introdujo en Windows 8.

Podemos usar la propiedad ConnectorPresent para filtrar solo a los adaptadores físicos. A continuación debemos eliminar los adaptadores Wi-Fi (que están presentes entre los adaptadores físicos), podemos usar Tipo de interfaz y/o NdisPhysicalMedium propiedades.

InterfaceType se define por la Internet Assigned Autoridad de Nombres de Internet (IANA) y para todas las interfaces de red-como es el valor ethernetCsmacd (6) (ver https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib).

En NdisPhysicalMedium es para adaptadores Ethernet valores o 802,3 (14).

Así que mi solución para esto en C# es:

try 
{ 
    var objectSearcher = new ManagementObjectSearcher("root\\StandardCimv2", [email protected]"select Name, InterfaceName, InterfaceType, NdisPhysicalMedium from MSFT_NetAdapter where ConnectorPresent=1"); //Physical adapter 

    int count = 0; 
    foreach (var managementObject in objectSearcher.Get()) 
    { 
     //The locally unique identifier for the network interface. in InterfaceType_NetluidIndex format. Ex: Ethernet_2. 
     string interfaceName = managementObject["InterfaceName"]?.ToString(); 
     //The interface type as defined by the Internet Assigned Names Authority (IANA). 
     //https://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib 
     UInt32 interfaceType = Convert.ToUInt32(managementObject["InterfaceType"]); 
     //The types of physical media that the network adapter supports. 
     UInt32 ndisPhysicalMedium = Convert.ToUInt32(managementObject["NdisPhysicalMedium"]); 

     if (!string.IsNullOrEmpty(interfaceName) && 
      interfaceType == 6 &&  //ethernetCsmacd(6) --for all ethernet-like interfaces, regardless of speed, as per RFC3635 
      (ndisPhysicalMedium == 0 || ndisPhysicalMedium == 14)) //802.3 
     { 
      count++; 
     } 
    } 

    return count; 
} 
catch (ManagementException) 
{ 
    //Run-time requirements WMI MSFT_NetAdapter class is included in Windows 8 and Windows Server 2012 
} 
+0

Esto es bueno. Gracias. Lástima que todavía estemos usando Windows 7 Embedded en todos nuestros dispositivos aún :( – ScottN

Cuestiones relacionadas