Как получить имя подключения сетевой карты по умолчанию

ВАЖНОЕ РЕДАКТИРОВАНИЕ: еще раз вернемся к этой теме. Как вы сказали, сетевой карты по умолчанию не должно быть, я пытаюсь понять, есть ли способ обнаружить все фактически подключенные сетевые карты.

Имея MAC-адрес моего физического интерфейса, есть ли программный способ получить имя интерфейса/статус интерфейса/и т.д....

Например, моя машина XP:

Устройство Realtek RTL8139 Family PCI Fast Ethernet NIC MAC XXXX-XXXX-XXXX

ХХХ-ХХХХ-ХХХХ это то, что я знаю

Через это устройство я подключаюсь, используя соединение «Подключение по локальной сети» (со всей информацией, связанной со шлюзом, подсетью и т. д.).

Итак, я ищу связь между XXXX-XXXX-XXXX и подключением по локальной сети.

Надеюсь теперь все понятно.

Спасибо всем! P.S. Извините за задержку... +1 голос всем, терпения!


Старый вопрос


Привет всем, я хотел бы изменить IP-адрес «Подключение по локальной сети» с помощью команды netsh.

Моя проблема в том, есть ли программный способ получить имя подключения по умолчанию (то есть именно «Подключение по локальной сети»)?

Спасибо

РЕДАКТИРОВАТЬ: мне не нужен список всех имен соединений, а только имя по умолчанию. При доступе к реестру я получаю список, и кажется, что по умолчанию он отмечен *. К сожалению, печатая их на консоли, я получаю 10 разных «подключений по локальной сети», например...

Local Area Connection* 13
6TO4 Adapter
VMware Network Adapter VMnet1
Wireless Network Connection 2
Reusable ISATAP Interface {483968F2-DBF9-4596-B8BE-725FAAB89F93}
Local Area Connection* 3
Local Area Connection* 2
Reusable Microsoft 6To4 Adapter
Local Area Connection* 7
VMware Network Adapter VMnet8
Local Area Connection* 8
isatap.replynet.prv
Local Area Connection* 9
Local Area Connection* 12
isatap.{FAA80CE0-D641-408A-83F8-5F9C394FFD76}
Bluetooth Network Connection
Local Area Connection* 4
isatap.{40156BF9-6599-4912-A315-62DE5342B452}
isatap.{7651F2F5-4888-4258-92C5-6822C506D726}
Local Area Connection* 5
isatap.{34F5F074-8AA7-4421-AE24-131BA2DC3458}
Local Area Connection*
Local Area Connection* 10
Local Area Connection
Local Area Connection* 6
Wireless Network Connection

и так далее...

РЕДАКТИРОВАТЬ 2: @ho1 запускает ваш код, изменяя FriendlyName, которого не существует с именем, вы получите что-то вроде списка позади, к сожалению, это не похоже на ожидаемый результат

0 - WAN Miniport (SSTP)
1 - WAN Miniport (IKEv2)
2 - WAN Miniport (L2TP)
3 - WAN Miniport (PPTP)
4 - WAN Miniport (PPPOE)
5 - WAN Miniport (IPv6)
6 - WAN Miniport (Network Monitor)
7 - Realtek RTL8168C(P)/8111C(P) Family PCI-E Gigabit Ethernet NIC (NDIS 6.20)
8 - WAN Miniport (IP)
9 - Microsoft ISATAP Adapter
10 - RAS Async Adapter
11 - Broadcom 802.11g Network Adapter
12 - Microsoft 6to4 Adapter
13 - VMware Virtual Ethernet Adapter for VMnet1
14 - Microsoft ISATAP Adapter #3
15 - VMware Virtual Ethernet Adapter for VMnet8
16 - Microsoft ISATAP Adapter #2
17 - Microsoft ISATAP Adapter #4
18 - Microsoft Virtual WiFi Miniport Adapter
19 - Microsoft ISATAP Adapter #5
20 - Microsoft ISATAP Adapter
22 - Bluetooth Device (Personal Area Network)
23 - Microsoft 6to4 Adapter
24 - Microsoft 6to4 Adapter #3
25 - Microsoft 6to4 Adapter #2

person Mauro    schedule 11.08.2010    source источник
comment
Можно ли установить сетевую карту по умолчанию в Windows 7? Я знаю, что в этом вопросе не указана ОС, я просто не могу найти вариант...   -  person fletcher    schedule 11.08.2010
comment
@fletcher: я думаю, сетевой карты по умолчанию вообще нет. Существует маршрут по умолчанию, который зависит от цели запроса, порядка добавления сетевых карт и таблицы маршрутизации.   -  person abatishchev    schedule 11.08.2010
comment
@both извините, я намеренно оставил спецификацию ОС, чтобы найти более независимое от ОС решение :) Что вы думаете о списке сетей, который я получил из реестра (Win7)?   -  person Mauro    schedule 11.08.2010
comment
@Mauro - я не думаю, что есть способ найти окончательную сетевую карту по умолчанию. Я думаю, вам придется использовать один из предоставленных ответов и отфильтровать результаты на основе другой информации, доступной в объекте, например, состояние соединения, чтобы принять решение.   -  person fletcher    schedule 11.08.2010
comment
Обновлен мой ответ с лучшим кодом (но не уверен, что он даст вам код по умолчанию).   -  person Hans Olsson    schedule 11.08.2010
comment
Кстати, вместо того, чтобы использовать внешний инструмент для установки IP (netsh), вы, вероятно, могли бы сделать это с помощью Win32_NetworkAdapterConfiguration.EnableStatic, это может быть более аккуратно.   -  person Hans Olsson    schedule 11.08.2010
comment
@fletcher: мне интересно то же самое...   -  person leppie    schedule 11.08.2010


Ответы (6)


Это грязный способ сделать это, поскольку его можно оптимизировать, включив LINQ и т. д.

using System.Net.NetworkInformation;

List<NetworkInterface> Interfaces = new List<NetworkInterface>();
foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
{
    if (nic.OperationalStatus == OperationalStatus.Up)
    {
        Interfaces.Add(nic);
    }
}


NetworkInterface result = null;
foreach (NetworkInterface nic in Interfaces)
{
    if (result == null)
    {
        result = nic;
    }
    else
    {
        if (nic.GetIPProperties().GetIPv4Properties() != null)
        {
            if (nic.GetIPProperties().GetIPv4Properties().Index < result.GetIPProperties().GetIPv4Properties().Index)
                result = nic;
        }
    }
}

Console.WriteLine(result.Name);

вы, вероятно, захотите адаптировать свои результаты, используя результаты из nic.GetIPProperties() и nic.GetIPProperties().GetIPv4Properties()

person Greg Buehler    schedule 08.09.2010
comment
Привет энтенс, большое спасибо. Последний вопрос: возможно ли получить маску подсети IPv4 (как и окно сведений о сетевом подключении Windows) из класса NetworkInterface? - person Mauro; 09.09.2010
comment
Вы можете получить доступ к массиву UnicastAddresses. Соответствующая информация должна быть в первом индексе. Таким образом, чтобы получить маску подсети, вы должны получить доступ к result.GetIPProperties().UnicastAddresses[0].IPv4Mask в соответствии с кодом в ответе. Возможно, вам придется перебрать его, чтобы получить то, что вы ищете. - person Greg Buehler; 09.09.2010

Как уже упоминалось, в Windows нет адаптера NIC «по умолчанию». Используемый сетевой адаптер выбирается на основе сети назначения (адреса) и метрики.

Например, если у вас есть два сетевых адаптера и две разные сети:

  10.1.10.1 - Local Area Connection (metric 20)
  10.1.50.1 - Local Area Connection 2 (metric 10)

И вы хотите подключиться к 10.1.10.15, Windows выберет Local Area Connection и направит туда. И наоборот, если вы хотите подключиться к 10.1.50.30, Windows выберет Local Area Connection 2.

Теперь, если вы попытаетесь подключиться к 74.125.67.106 (google.com), Windows выберет Local Area Connection 2, так как у него более низкое значение показателя.

РЕДАКТИРОВАТЬ: Вот отличная статья, объясняющая маршрутизацию - http://www.windowsnetworking.com/articles_tutorials/Making-Sense-Windows-Routing-Tables.html
EDIT2: Орфография.

Надеюсь это поможет.

person Jesse    schedule 11.08.2010

using System.Linq;
using System.Net.NetworkInformation;

var nic = NetworkInterface
     .GetAllNetworkInterfaces()
     .FirstOrDefault(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback && i.NetworkInterfaceType != NetworkInterfaceType.Tunnel);
var name = nic.Name;

или более элегантное решение:

.Where(i => !(
    new[] { NetworkInterfaceType.Loopback, NetworkInterfaceType.Tunnel }
    .Contains(i.NetworkInterfaceType)))

или если вы хотите попрактиковаться в LINQ:

static IEnumerable<NetworkInterface> GetAllNetworkInterfaces(IEnumerable<NetworkInterfaceType> excludeTypes)
{
    var all = NetworkInterface.GetAllNetworkInterfaces();
    var exclude = all.Where(i => excludeTypes.Contains(i.NetworkInterfaceType));
    return all.Except(exclude);
}

Использование:

var nic = GetAllNetworkInterfaces(new[] { NetworkInterfaceType.Tunnel, NetworkInterfaceType.Loopback });
person abatishchev    schedule 11.08.2010
comment
Я ошибаюсь или FirstOrDefault даст, если у меня их несколько, первый из списка, а НЕ по умолчанию? - person Mauro; 11.08.2010
comment
@Mauro: FirstOrDefault<T> возвращается первым из списка. Если список пуст, то default(T) (null для ссылочных типов) - person abatishchev; 11.08.2010
comment
Да, я знаю :D Концепция по умолчанию, которую я здесь использую, означает соединение, которое используется, то есть по умолчанию. - person Mauro; 11.08.2010
comment
@Mauro - Что, если используется несколько? - person fletcher; 11.08.2010
comment
@Mauro: :) Да, извините, только сначала, но не по умолчанию. Потому что нет системного ник по умолчанию. Это может быть ник для маршрута по умолчанию, который зависит от заданной цели и вообще - от таблицы маршрутизации. - person abatishchev; 11.08.2010
comment
@Fletcher: вы правы, я должен был сказать только значение по умолчанию ... как видно из имени соединения, отмеченного звездочкой в ​​реестре. Что вы думаете? - person Mauro; 11.08.2010

Можно использовать класс WMI Win32_NetworkAdapter перечислите все адаптеры, и у него есть свойство Index, которое может означать, что тот, у которого 0 или 1 в качестве Index, является адаптером по умолчанию, или одно из других свойств может помочь найти адаптер по умолчанию.

Что-то вроде этого, может быть:

Изменить: исправлен неработающий код (по крайней мере, это с большей вероятностью сработает). Но после того, что сказал абатищев, я думаю, вам может понадобиться использовать Win32_NetworkAdapterConfiguration.IPConnectionMetric, чтобы найти адаптер по умолчанию...

ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
foreach (ManagementObject mo in mc.GetInstances())
{
     int index = Convert.ToInt32(mo["Index"]);
     string name = mo["NetConnectionID"] as string;
     if (!string.IsNullOrEmpty(name))
          textBox1.Text += name + Environment.NewLine;
}
person Hans Olsson    schedule 11.08.2010

У моего друга (Чиро Д.А.) была такая же проблема. Немного поигравшись с c#, мы вроде бы нашли способ пропустить виртуальный (не совсем подключенный Ip): искали гейтавей, отбрасывая не только те, у кого его не было, но и те, у кого был фиктивный (0.0.0.0) . На моей машине последних ровно два виртуальных адаптера Vm-Ware.

public static void DisplayIPAddresses()
    {

        Console.WriteLine("\r\n****************************");
        Console.WriteLine("     IPAddresses");
        Console.WriteLine("****************************");


        StringBuilder sb = new StringBuilder();
        // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)     
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface network in networkInterfaces)
        {

            if (network.OperationalStatus == OperationalStatus.Up )
            {
                if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue;
                //GatewayIPAddressInformationCollection GATE = network.GetIPProperties().GatewayAddresses;
                // Read the IP configuration for each network   

                IPInterfaceProperties properties = network.GetIPProperties();
                //discard those who do not have a real gateaway 
                if (properties.GatewayAddresses.Count > 0)
                {
                    bool good = false;
                    foreach  (GatewayIPAddressInformation gInfo in properties.GatewayAddresses)
                    {
                        //not a true gateaway (VmWare Lan)
                        if (!gInfo.Address.ToString().Equals("0.0.0.0"))
                        {
                            sb.AppendLine(" GATEAWAY "+ gInfo.Address.ToString());
                            good = true;
                            break;
                        }
                    }
                    if (!good)
                    {
                        continue;
                    }
                }
                else {
                    continue;
                }
                // Each network interface may have multiple IP addresses       
                foreach (IPAddressInformation address in properties.UnicastAddresses)
                {
                    // We're only interested in IPv4 addresses for now       
                    if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue;

                    // Ignore loopback addresses (e.g., 127.0.0.1)    
                    if (IPAddress.IsLoopback(address.Address)) continue;

                    if (!address.IsDnsEligible) continue;
                    if (address.IsTransient) continue; 

                    sb.AppendLine(address.Address.ToString() + " (" + network.Name + ") nType:" + network.NetworkInterfaceType.ToString()     );
                }
            }
        }
        Console.WriteLine(sb.ToString());
    }
person Cesare Imperiali    schedule 01.02.2012

Вы можете получить их список, но не по умолчанию (возможно, вы можете предположить, что это первая запись).

static void Main(string[] args)
{
  foreach (var nc in NetworkInterface.GetAllNetworkInterfaces())
  {
    Console.WriteLine(nc.Name);
  }

  Console.ReadLine();
}
person leppie    schedule 11.08.2010
comment
Пожалуйста, не принимайте это на свой счет, так как значение по умолчанию следует использовать программно, список не поможет. Если вы говорите, что это невозможно, и доказываете это, то я могу принять ваш ответ. Мир - person Mauro; 11.08.2010
comment
@Mauro: все зависит от того, что определяет значение по умолчанию. Что делает «Подключение по локальной сети» по умолчанию? Я никогда не видел такой настройки в Windows. Самое близкое, что я могу придумать, это метрика маршрутизации для каждой сети. - person leppie; 11.08.2010