C# 如何获取网络适配器索引?

C# 如何获取网络适配器索引?,c#,windows,networking,routing,C#,Windows,Networking,Routing,从代码中,我想强制Windows计算机使用特定的网络适配器进行与特定IP地址的所有连接 我计划通过使用ROUTE ADD命令行工具来实现这一点,但这需要我提前知道网络适配器的索引号,因为它必须提供给ROUTE ADD命令 问题:如果我知道网络适配器的名称,如何以编程方式检索它的索引 我知道ROUTE PRINT向我显示了所有网络适配器的索引号所需的信息,但是必须有一种方法可以通过编程方式获得这些信息,C 请注意,我不喜欢解析ROUTE PRINT的文本输出,因为文本格式可能会随着Windows版

从代码中,我想强制Windows计算机使用特定的网络适配器进行与特定IP地址的所有连接

我计划通过使用ROUTE ADD命令行工具来实现这一点,但这需要我提前知道网络适配器的索引号,因为它必须提供给ROUTE ADD命令

问题:如果我知道网络适配器的名称,如何以编程方式检索它的索引

我知道ROUTE PRINT向我显示了所有网络适配器的索引号所需的信息,但是必须有一种方法可以通过编程方式获得这些信息,C


请注意,我不喜欢解析ROUTE PRINT的文本输出,因为文本格式可能会随着Windows版本的不同而变化。

您是否研究过使用C的system.net.networkinformation界面


我不熟悉ROUTE ADD,但从理论上讲,您可以将信息从一个路由添加到另一个路由添加。

您可以获得网络适配器的接口索引 通过使用.Net NetworkInterface和相关类

下面是一个代码示例:

static void PrintInterfaceIndex(string adapterName)
{
  NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
  IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();

  Console.WriteLine("IPv4 interface information for {0}.{1}",
                properties.HostName, properties.DomainName);


  foreach (NetworkInterface adapter in nics)
  {               
    if (adapter.Supports(NetworkInterfaceComponent.IPv4) == false)
    {
      continue;
    }

    if (!adapter.Description.Equals(adapterName, StringComparison.OrdinalIgnoreCase))
    {
      continue;
    }
    Console.WriteLine(adapter.Description);                                
    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();                
    IPv4InterfaceProperties p = adapterProperties.GetIPv4Properties();
    if (p == null)
    {
      Console.WriteLine("No information is available for this interface.");                    
      continue;
    }                
    Console.WriteLine("  Index : {0}", p.Index);              
  }
}
然后用网络适配器的名称调用此函数:

PrintInterfaceIndex("your network adapter name");
您还可以获取网络适配器的InterfaceIndex 通过使用Win32_NetworkAdapter WMI类。Win32_NetworkAdapter类 包含名为InterfaceIndex的属性

因此,要检索具有给定值的网络适配器的InterfaceIndex 名称,请使用以下代码:

ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapter WHERE Description='<Your Network Adapter name goes here>'");           
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
  using (ManagementObjectCollection queryCollection = searcher.Get())
  {             
    foreach (ManagementObject mo in queryCollection)
    {                 
      Console.WriteLine("InterfaceIndex : {0}, name {1}", mo["InterfaceIndex"], mo["Description"]);
    }
  }
}
如果不想使用WMI,也可以使用Win32 API函数 与IP_适配器_信息结构结合使用。
你可以在这里找到一个例子

是的,我有,但它似乎没有给我所需要的信息。尝试从命令行输入ROUTE PRINT并查看显示的第一个表。我需要的索引号在每行列表的最左边一栏……嗨,汉斯-你的代码看起来很有希望-我明天早上回去工作时第一件事就是试用它。嗨,汉斯-你的代码看起来很有希望,我明天回去工作时第一件事就是试用它。然而,今天早些时候我尝试使用WMI方法,我列出了每个网络适配器的所有可用属性,但我没有看到任何名为InterfaceIndex的属性-也许我只是忽略了它?我正在使用Windows XP Professional SP3。明天我会告诉你我发现了什么。非常感谢你的参与,有你这样的人在身边真是太好了@MartinChristiansen:此WMI属性在Windows XP下不可用。这解释了为什么我没有看到它。然而,我现在已经尝试了您的第一个代码示例,它就像一个符咒一样工作——即使是在XP中。你真的救了我一天-非常感谢!