14

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

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

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

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

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

4

2 回答 2

12

您可以使用 .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");

您还可以使用Win32_NetworkAdapterWMI 类获取网络适配器的 InterfaceIndex。该类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 函数 GetAdaptersInfoIP_ADAPTER_INFO结构结合使用。您将在pinvoke.net找到一个示例。

于 2012-06-21T20:17:11.737 回答
0

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

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

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

于 2012-06-21T19:12:44.920 回答