5

重要な編集:このテーマに戻ってください。デフォルトのNICはないはずだとおっしゃっていましたが、実際に接続されているすべてのNICを検出する方法があるかどうかを理解しようとしています。

物理インターフェイスのMACアドレスを取得することで、インターフェイス名/インターフェイスステータスなどをプログラムで取得できます。

たとえば、私のXPマシン:

デバイスRealtekRTL8139ファミリPCIファストイーサネットNICMACXXXX-XXXX-XXXX

XXXX-XXXX-XXXXは私が知っていることです

このデバイスを介して、「ローカルエリア接続」接続を使用して接続します(ゲートウェイ、サブネットなどに関連するすべての情報を使用)

だから私はXXXX-XXXX-XXXXとローカルエリア接続の間のリンクを探しています。

すべてが明確になったことを願っています。

皆さんありがとう!PS遅れてすみません...忍耐のために、全員に+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
4

6 に答える 6

5

他の人が述べているように、Windowsには「デフォルト」のNICアダプタはありません。使用するNICは、宛先ネットワーク(アドレス)とメトリックに基づいて選択されます。

たとえば、2つのNICと2つの異なるネットワークがある場合:

  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)に接続しようとするとLocal Area Connection 2、メトリック値が低いため、Windowsが選択します。

編集:ルーティングを説明する素晴らしい記事があります
-http://www.windowsnetworking.com/articles_tutorials/Making-Sense-Windows-Routing-Tables.html編集2:スペル。

お役に立てれば。

于 2010-08-11T16:36:57.740 に答える
3
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 });
于 2010-08-11T10:06:18.187 に答える
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()

于 2010-09-08T17:01:57.890 に答える
2

WMI クラスWin32_NetworkAdapterを使用してすべてのアダプターを列挙できます。これにはIndex、0 または 1 を持つものIndexが既定のものであることを意味するプロパティ、または他のプロパティの 1 つが既定のものを見つけるのに役立つ可能性があることを意味するプロパティがあります。

このようなものかもしれません:

編集:壊れたコードを修正しました(これは少なくとも動作する可能性が高くなります)。しかし、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;
}
于 2010-08-11T10:13:11.097 に答える
1

私の友人(Ciro DA)も同じ問題を抱えていました。c#で少し遊んで、仮想(実際には接続されていないIP)をスキップする方法を見つけたようです:それを持っていない人だけでなく、ダミー(0.0.0.0)を持っている人も捨ててゲートアウェイを探しました。私のマシンでは、これらはちょうど2つの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());
    }
于 2012-02-01T17:26:23.000 に答える
0

それらのリストを取得できますが、デフォルトでは取得できません (おそらく、それが最初のエントリであると想定できます)。

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

  Console.ReadLine();
}
于 2010-08-11T09:57:25.093 に答える