在 C# 中查找接口索引
本文关键字:接口 索引 查找 | 更新日期: 2023-09-27 18:37:19
如何在 C# 中获取连接的 interace 索引?
如果索引不是标准术语,我的意思是与接口关联的数字,例如当您使用命令"netsh int ipv4 show int"按左侧的索引列出您的连接时。它也用于"路由添加 [网关] 掩码 [索引] 如果 [接口索引]"。
我知道接口的名称和描述,所以使用NetworkInterface.GetAllNetworkInterfaces()然后在那里找到正确的接口是相当简单的。不过,从那里我找不到索引。我认为 ID 可能是相同的,但它的值形式为"{
XXXXXXX-XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX我想你想要
myInterface.GetIPProperties().GetIPv4Properties().Index;
如在
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach(var @interface in interfaces)
{
var ipv4Properties = @interface.GetIPProperties().GetIPv4Properties();
if (ipv4Properties != null)
Console.WriteLine(ipv4Properties.Index);
}
请注意,如果接口没有可用的 IPv4 信息,GetIPv4Properties()
可以返回null
。
此 msdn 页显示了一个可能有帮助的示例。
所有网络接口都有一个 GUID,该 GUID 唯一地将它们区分开来,并用于 Win 环境中的单独操作,这就是 ID。
idx不直接分配给NIC,而是被Windows管理系统用作用户设置详细信息的方式。
这里有一段代码,显示了如何访问可能包含信息的ManagementObjectSearcher,您必须解析结果(而不仅仅是选择名称,如下所示)
internal static IEnumerable<string> GetConnectedCardNames()
{
string query = String.Format(@"SELECT * FROM Win32_NetworkAdapter");
var searcher = new ManagementObjectSearcher
{
Query = new ObjectQuery(query)
};
try
{
log.Debug("Trying to select network adapters");
var adapterObjects = searcher.Get();
var names = (from ManagementObject o in adapterObjects
select o["Name"])
.Cast<string>();
return names;
}
catch (Exception ex)
{
log.Debug("Failed to get needed names, see Exception log for details");
log.Fatal(ex);
throw;
}
}
您是在谈论网络适配器绑定顺序吗?如果是这样,则通常存储在此注册表项中:
HKEY_LOCAL_MACHINE''SYSTEM''CurrentControlSet''services''Tcpip''Linkage
我更新了Elian Ebbing的答案,只得到了支持IPv4的适配器:
IEnumerable<KeyValuePair<int, NetworkInterface>> GetNetworkInterfaces()
{
foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
{
IPv4InterfaceProperties properties = null;
try { properties = networkInterface.GetIPProperties().GetIPv4Properties(); }
catch (NetworkInformationException) { /* this one doesn't support IPv4 */ }
if (properties != null)
yield return new KeyValuePair<int, NetworkInterface>(properties.Index, networkInterface);
}
}
附言由于涉及异常,因此此代码可能会很慢。 我建议从此方法返回的序列构造查找,并重复使用它NetworkChange.NetworkAddressChanged
直到引发事件。