在 C# 中查找接口索引



如何在 C# 中获取连接的 interace 索引?

如果索引不是标准术语,我的意思是与接口关联的数字,例如当您使用命令"netsh int ipv4 show int"按左侧的索引列出您的连接时。它也用于"路由添加 [网关] 掩码 [索引] 如果 [接口索引]"。

我知道接口的名称和描述,所以使用NetworkInterface.GetAllNetworkInterfaces()然后在那里找到正确的接口是相当简单的。不过,从那里我找不到索引。我认为 ID 可能是相同的,但它的值形式为"{

XXXXXXX-XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我想你想要

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 页显示了一个可能有帮助的示例。

所有网络接口都有一个 GUID,该 GUID 唯一地将它们区分开来,并用于 Win 环境中的单独操作,这就是 ID。

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

您是在谈论网络适配器绑定顺序吗?如果是这样,则通常存储在此注册表项中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Linkage

我更新了Elian Ebbing的答案,只得到了支持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);
     }
  }

附言由于涉及异常,因此此代码可能会很慢。 我建议从此方法返回的序列构造查找,并重复使用它NetworkChange.NetworkAddressChanged直到引发事件。

最新更新