2012-06-21 35 views
8

Desde el código Quiero forzar a una máquina con Windows a usar un adaptador de red específico para todas las conexiones a una dirección IP específica.¿Cómo obtener el índice del adaptador de red?

planeo hacerlo a través de la ruta Incluir herramienta de línea de comandos, pero esto requiere que yo sepa de antemano los adaptadores de red número de índice (ya que se debe dar a la ruta de comando ADD).

PREGUNTA: ¿Cómo puedo recuperar programáticamente el índice de un adaptador de red, dado que sé su nombre?

Soy consciente de que ROUTE PRINT me muestra la información que necesito (los números de índice de todos los adaptadores de red están presentes), pero también debe haber una forma de obtenerla programáticamente (C#)?

Tenga en cuenta que no me gusta analizar el resultado de texto de ROUTE PRINT, ya que el formato de texto puede cambiar con diferentes versiones de Windows.

Respuesta

7

Puede obtener el índice de interfaz de su adaptador de red utilizando las clases .NET NetworkInterface (y relacionadas).

Aquí es un ejemplo de código:

static void PrintInterfaceIndex(string adapterName) 
{ 
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
    IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); 

    Console.WriteLine("IPv4 interface information for {0}.{1}", 
       properties.HostName, properties.DomainName); 


    foreach (NetworkInterface adapter in nics) 
    {    
    if (adapter.Supports(NetworkInterfaceComponent.IPv4) == false) 
    { 
     continue; 
    } 

    if (!adapter.Description.Equals(adapterName, StringComparison.OrdinalIgnoreCase)) 
    { 
     continue; 
    } 
    Console.WriteLine(adapter.Description);         
    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();     
    IPv4InterfaceProperties p = adapterProperties.GetIPv4Properties(); 
    if (p == null) 
    { 
     Console.WriteLine("No information is available for this interface.");      
     continue; 
    }     
    Console.WriteLine(" Index : {0}", p.Index);    
    } 
} 

A continuación, sólo llamar a esta función con el nombre de su adaptador de red:

PrintInterfaceIndex("your network adapter name"); 

También puede obtener el InterfaceIndex de su adaptador de red mediante el uso de la clase WMI Win32_NetworkAdapter. La clase Win32_NetworkAdapter contiene una propiedad llamada InterfaceIndex.

Por lo tanto, para recuperar el InterfaceIndex para un adaptador de red con un nombre dado, utilice el siguiente código:

ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2"); 

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapter WHERE Description='<Your Network Adapter name goes here>'");   
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) 
{ 
    using (ManagementObjectCollection queryCollection = searcher.Get()) 
    {    
    foreach (ManagementObject mo in queryCollection) 
    {     
     Console.WriteLine("InterfaceIndex : {0}, name {1}", mo["InterfaceIndex"], mo["Description"]); 
    } 
    } 
} 

Si no desea utilizar WMI también se puede utilizar la función de API Win32 GetAdaptersInfo en combinación con la estructura IP_ADAPTER_INFO. Encontrará un ejemplo aquí pinvoke.net.

+0

Hola, Hans, tu código parece muy prometedor. Lo intentaré mañana a primera hora de la mañana, cuando regrese al trabajo. –

+0

Hola, Hans: tu código parece muy prometedor, lo intentaré mañana como lo primero cuando vuelva a trabajar. Sin embargo, hoy he intentado usar el enfoque de WMI, y enumeré todas las propiedades disponibles para cada adaptador de red, pero no vi ninguna propiedad llamada "InterfaceIndex". ¿Tal vez simplemente lo pasé por alto? Estoy usando Windows XP Professional SP3. Te dejaré saber lo que averigüe mañana.Muchas gracias por su participación. ¡Es fantástico tener gente como usted! –

+0

@MartinChristiansen: esta propiedad WMI no está disponible en Windows XP. – Hans

0

¿ha analizado el uso de la interfaz system.net.netinformation de C#?

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx

No estoy familiarizado con la ruta ADD, pero que en teoría se puede casar a la información de una con la otra.

+0

Sí, lo tengo, pero parece que no me da la información que necesito. Intente ingresar la IMPRESIÓN EN RUTA desde una línea de comando y observe la primera tabla que se muestra. Los números de índice que necesito están en la columna más a la izquierda (cada línea enumera ... ... ). –

Cuestiones relacionadas