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