5

C#で接続のインターフェースのインデックスを取得するにはどうすればよいですか?

インデックスが標準用語ではない場合、左側のインデックス別に接続を一覧表示するコマンド「netsh int ipv4 show int」を使用する場合など、インターフェイスに関連付けられている番号を意味します。「routeadd[gateway]mask [index]if[interfaceindex]」でも使用されます。

インターフェイスの名前と説明を知っているので、NetworkInterface.GetAllNetworkInterfaces()を使用して、そこで適切なインターフェイスを見つけるのはかなり簡単です。そこから、インデックスが見つかりません。IDは同じかもしれないと思いましたが、それは「{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}」の形式の値を持ち、小さな整数値ではありません。

4

4 に答える 4

8

私はあなたが欲しいと思います

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

インターフェイスで使用可能なIPv4情報がない場合GetIPv4Properties()に戻る可能性があることに注意してください。null

このmsdnページは、役立つ可能性のある例を示しています。

于 2012-06-16T00:20:28.600 に答える
1

すべてのネットワークインターフェイスには、それらを一意に区別するGUIDが与えられ、IDが何であるかというWin環境での個々の操作に使用されます。

idxはNICに直接割り当てられていませんが、詳細を設定するユーザーの熱心な方法として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;
}
}
于 2012-06-16T00:18:26.170 に答える
0

ネットワークアダプタのバインド順序について話しているのですか?その場合、それは通常、このレジストリキーに保存されます。

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Linkage

于 2012-06-16T00:18:09.103 に答える
0

私はElianEbbingの回答を更新して、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このメソッドによって返されたシーケンスからルックアップを構築し、イベントが発生するまでそれを再利用することをお勧めします。

于 2019-07-15T20:12:32.320 に答える