如何获取网络适配器索引?
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 中获取网络适配器统计信息?