如何获取默认NIC连接名称

时间:2010-08-11 09:43:50

标签: c# command-line netsh

重要编辑:再次回到此主题。 如你所说,应该没有默认网卡,我试图了解是否有办法检测实际连接的所有网卡。

拥有物理接口的MAC地址是一种获得接口名称/接口状态/等的编程方式......

例如,我的XP机器:

Device Realtek RTL8139系列PCI快速以太网NIC MAC XXXX-XXXX-XXXX

XXXX-XXXX-XXXX就是我所知道的

通过此设备,我使用“本地连接”连接进行连接(所有信息都与网关,子网等相关)

所以我正在搜索XXXX-XXXX-XXXX和本地连接之间的链接。

希望现在一切都很清楚。

谢谢大家! 附:抱歉延迟... +1投票给所有人,耐心等待!


旧问题


大家好, 我想使用命令netsh更改“本地连接”的IP。

我的问题是有一种编程方式来获取默认连接名称(即完全是“本地连接”)吗?

由于

编辑:我不需要所有连接名称的列表,只需要默认列表。访问注册表我得到列表,似乎默认标记为*。 不幸的是,在控制台上打印它们我得到了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运行你的代码更改不存在Name的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

6 个答案:

答案 0 :(得分:5)

正如其他人所提到的,Windows中没有“默认”NIC适配器。使用的NIC是根据目标网络(地址)和指标选择的。

例如,如果您有两个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:拼写。

希望这有帮助。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您可以使用WMI类Win32_NetworkAdapter枚举所有适配器,并且它具有Index属性,这可能意味着具有0或1作为Index的那个是默认值,或其他一个属性可能有助于找到默认属性。

这样的事情可能是:

编辑:修复损坏的代码(这至少更有可能工作)。但是按照abatishchev的说法,我认为您可能需要使用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;
}

答案 3 :(得分:2)

这是一种肮脏的方式,因为它可以通过合并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()

的结果来定制结果

答案 4 :(得分:1)

我的一位朋友(Ciro D.A.)遇到了同样的问题。用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());
    }

答案 5 :(得分:0)

您可以获取它们的列表,但不是默认值(也许您可以假设它是第一个条目)。

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

  Console.ReadLine();
}