Нахождение индекса интерфейса в C#

Как я могу получить индекс взаимодействия для соединения в C#?

В случае, если индекс не является стандартным термином, я имею в виду число, связанное с интерфейсом, например, когда вы используете команду "netsh int ipv4 show int", чтобы вывести список ваших соединений по индексу слева. Он также используется в "route add [gateway] mask [index] if [interface index]".

Я знаю имя и описание интерфейса, поэтому довольно просто использовать NetworkInterface.GetAllNetworkInterfaces(), а затем найти правильный. Оттуда, однако, я не могу найти индекс. Я думал, что ID может быть таким же, но он имеет значения вида "{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}", а не маленькие целочисленные значения.

3 ответа

Решение

Я думаю ты хочешь

myInterface.GetIPProperties().GetIPv4Properties().Index;

Как в

var interfaces = NetworkInterface.GetAllNetworkInterfaces(); 

foreach(var @interface in interfaces)
{
    var ipv4Properties = @interface.GetIPProperties().GetIPv4Properties();

    if (ipv4Properties != null)
        Console.WriteLine(ipv4Properties.Index);
}

Обратите внимание, что GetIPv4Properties() может вернуться null если информация об IPv4 недоступна для интерфейса.

Эта страница MSDN показывает пример, который может быть полезным.

Всем сетевым интерфейсам присваивается GUID, который уникальным образом выделяет их и используется для отдельных манипуляций в среде Win.

Идентификатор не назначен напрямую сетевой плате, а используется системой управления Windows как простой способ задания деталей пользователем.

Здесь приведен фрагмент кода, который показывает, как получить доступ к ManagementObjectSearcher, который может содержать информацию, и вам придется анализировать результаты (вместо простого выбора имени, как показано ниже).

internal static IEnumerable<string> GetConnectedCardNames()
{
string query = String.Format(@"SELECT * FROM Win32_NetworkAdapter");
var searcher = new ManagementObjectSearcher
{
    Query = new ObjectQuery(query)
};

try
{
    log.Debug("Trying to select network adapters");
    var adapterObjects = searcher.Get();

    var names = (from ManagementObject o in adapterObjects
                    select o["Name"])
                        .Cast<string>();

    return names;
}
catch (Exception ex)
{
    log.Debug("Failed to get needed names, see Exception log for details");
    log.Fatal(ex);
    throw;
}
}

Вы говорите о порядке привязки сетевого адаптера? Если так, то это обычно хранится в этом разделе реестра:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services\Tcpip\ Рычажный

Я обновил ответ Элиана Эббинга, чтобы получить только адаптеры, поддерживающие IPv4:

  IEnumerable<KeyValuePair<int, NetworkInterface>> GetNetworkInterfaces()
  {
     foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
     {
        IPv4InterfaceProperties properties = null;
        try { properties = networkInterface.GetIPProperties().GetIPv4Properties(); }
        catch (NetworkInformationException) { /* this one doesn't support IPv4 */ }

        if (properties != null)
           yield return new KeyValuePair<int, NetworkInterface>(properties.Index, networkInterface);
     }
  }

PS Поскольку есть исключения, этот код может работать медленно. Я рекомендую создать поиск из последовательности, возвращаемой этим методом, и повторно использовать его до тех пор, покаNetworkChange.NetworkAddressChanged событие возникает.

Другие вопросы по тегам