2012-06-21 16 views
8

Z kodu chcę wymusić na komputerze z systemem Windows używanie określonej karty sieciowej dla wszystkich połączeń z określonym adresem IP.Jak uzyskać indeks karty sieciowej?

Mam zamiar zrobić to za pomocą narzędzia wiersza poleceń DROGOWY ADD, ale wymaga to wcześniejszego poznania numeru adapterów sieciowych (zgodnie z poleceniem ROUTE ADD).

PYTANIE: Jak mogę programowo pobrać indeks karty sieciowej, biorąc pod uwagę jego nazwę?

Mam świadomość, że ROUTE PRINT pokazuje mi informacje, których potrzebuję (numery indeksu wszystkich obecnych kart sieciowych), ale musi istnieć sposób, aby również programowo uzyskać te informacje (C#)?

Pamiętaj, że nie podoba mi się przetwarzanie tekstu z ROUTE PRINT, ponieważ format tekstu może się zmieniać w różnych wersjach systemu Windows.

Odpowiedz

7

Można uzyskać indeks interfejsu karty sieciowej przy użyciu klas .Net NetworkInterface (i pokrewnych).

Oto przykładowy kod:

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

Następnie wystarczy wywołać tę funkcję z nazwą karty sieciowej:

PrintInterfaceIndex("your network adapter name"); 

Można również uzyskać InterfaceIndex karty sieciowej za pomocą klasa WMI Win32_NetworkAdapter. Klasa Win32_NetworkAdapter zawiera właściwość o nazwie InterfaceIndex.

Tak więc, aby odzyskać InterfaceIndex dla karty sieciowej z danym nazwy, należy użyć następującego kodu:

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"]); 
    } 
    } 
} 

Jeśli nie chcesz korzystać z WMI można również użyć funkcji Win32 API GetAdaptersInfo w połączeniu ze strukturą IP_ADAPTER_INFO. Znajdziesz tutaj przykład tutaj: pinvoke.net.

+0

Witaj Hans - Twój kod wygląda obiecująco - wypróbuję go jutro jako pierwszą rzecz o poranku, kiedy wrócę do pracy. –

+0

Witaj Hans - Twój kod wygląda obiecująco, wypróbuję go jutro jako pierwszą rzecz, gdy wrócę do pracy. Jednak wcześniej dzisiaj próbowałem używać podejścia WMI i wymieniłem wszystkie właściwości dostępne dla każdej karty sieciowej, ale nie widziałem żadnej właściwości o nazwie "InterfaceIndex" - może po prostu przeoczyłem to? Korzystam z systemu Windows XP Professional SP3. Dam wam znać, czego się dowiem jutro.Bardzo dziękuję za zaangażowanie, fantastycznie jest mieć ludzi takich jak Ty! –

+0

@MartinChristiansen: Ta właściwość usługi WMI nie jest dostępna w systemie Windows XP. – Hans

0

Czy sprawdziłeś, używając interfejsu C# systemu system.net.networkinformation?

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

nie jestem zaznajomiony z ADD ROUTE, ale teoretycznie można ożenić się informacji od jednego z drugim.

+0

Tak, mam, ale nie wydaje mi się, żebym dostarczył potrzebnych informacji. Spróbuj wprowadzić ROUTE PRINT z wiersza poleceń i spójrz na pierwszą wyświetloną tabelę. Potrzebne numery indeksów znajdują się w skrajnie lewej kolumnie (każda linia zawiera listę ... ... ). –

Powiązane problemy