Как получить имя подключения NIC по умолчанию - PullRequest
4 голосов
/ 11 августа 2010

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

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

Например, мой компьютер с XP:

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

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

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

ИтакЯ ищу связь между XXXX-XXXX-XXXX и Local Area Connection.

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

Спасибо всем!PS Прошу прощения за задержку ... +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

и т. Д. *

EDIT2: @ ho1 при запуске вашего кодаизменяя FriendlyName, который не существует с Name, вы получите что-то вроде списка, к сожалению, это не похоже на ожидаемый результат

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

Ответы [ 6 ]

5 голосов
/ 11 августа 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: правописание.

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

2 голосов
/ 08 сентября 2010

Это грязный способ сделать это, так как его можно оптимизировать с помощью 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() и * 1005.*

2 голосов
/ 11 августа 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;
}
2 голосов
/ 11 августа 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 });
1 голос
/ 01 февраля 2012

У моего друга (Ciro DA) была такая же проблема.Немного поигравшись с 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());
    }
0 голосов
/ 11 августа 2010

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

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

  Console.ReadLine();
}
...