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

Posted

技术标签:

【中文标题】如何获取网络适配器索引?【英文标题】:How to get network adapter index? 【发布时间】:2012-06-24 02:04:55 【问题描述】:

从代码中,我想强制 Windows 机器使用特定网络适配器来连接到特定 IP 地址的所有连接。

我打算通过使用 ROUTE ADD 命令行工具来实现,但这需要我事先知道网络适配器的 索引号(因为它必须提供给 ROUTE ADD 命令) .

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

我知道 ROUTE PRINT 向我显示了我需要的信息(存在的所有网络适配器的索引号),但是也必须有一种方法可以通过编程方式获取该信息(C#)?

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

【问题讨论】:

【参考方案1】:

您可以获取您的网络适配器的接口索引 通过使用 .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 函数 GetAdaptersInfo 与 IP_ADAPTER_INFO 结构组合。 你会在这里找到一个例子pinvoke.net。

【讨论】:

嗨 Hans - 你的代码看起来很有前途 - 我明天早上第一件事就是尝试一下,当我重新开始工作时。 嗨,汉斯 - 你的代码看起来很有前途,我明天回去工作时第一件事就是试试。但是,今天早些时候,我尝试使用 WMI 方法,并列出了每个网络适配器可用的所有属性,但我没有看到任何名为“InterfaceIndex”的属性 - 也许我只是忽略了它?我正在使用 Windows XP Professional SP3。我明天会告诉你我发现了什么。非常感谢您的参与,有像您这样的人在身边真是太好了! @MartinChristiansen:此 WMI 属性在 Windows XP 下不可用。 这就解释了为什么我没有看到它。但是,我现在已经尝试了您的第一个代码示例,它就像一个魅力 - 即使使用 XP。你确实拯救了我的一天 - 非常感谢!【参考方案2】:

您是否研究过使用 C# 的 system.net.networkinformation 接口?

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface.getallnetworkinterfaces.aspx

我不熟悉 ROUTE ADD,但理论上你可以将一个与另一个的信息结合起来。

【讨论】:

是的,我有,但它似乎没有给我所需的信息。尝试从命令行输入 ROUTE PRINT 并查看显示的第一个表。我需要的索引号在最左边的列中(每行列出 ......)。

以上是关于如何获取网络适配器索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linux/Mac OSX 中获取网络适配器统计信息?

无法连接到一个 VM 上的网络适配器,相同的代码适用于另一个 VM

获取电脑的网络连接状态适配器状态

获取电脑的网络连接状态适配器状态

网络适​​配器 NUMA

获取有关已安装网络适配器的信息