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

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

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

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

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

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

【问题讨论】:

    标签: c# windows networking routing


    【解决方案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 函数 GetAdaptersInfoIP_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 并查看显示的第一个表。我需要的索引号在最左边的列中(每行列出 ......)。
    猜你喜欢
    • 2023-04-08
    • 2020-03-28
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多