重要编辑:再次回到此主题。 如你所说,应该没有默认网卡,我试图了解是否有办法检测实际连接的所有网卡。
拥有物理接口的MAC地址是一种获得接口名称/接口状态/等的编程方式......
例如,我的XP机器:
Device Realtek RTL8139系列PCI快速以太网NIC MAC XXXX-XXXX-XXXX
XXXX-XXXX-XXXX就是我所知道的
通过此设备,我使用“本地连接”连接进行连接(所有信息都与网关,子网等相关)
所以我正在搜索XXXX-XXXX-XXXX和本地连接之间的链接。
希望现在一切都很清楚。
谢谢大家! 附:抱歉延迟... +1投票给所有人,耐心等待!
旧问题
大家好, 我想使用命令netsh更改“本地连接”的IP。
我的问题是有一种编程方式来获取默认连接名称(即完全是“本地连接”)吗?
由于
编辑:我不需要所有连接名称的列表,只需要默认列表。访问注册表我得到列表,似乎默认标记为*。 不幸的是,在控制台上打印它们我得到了10种不同的“局域连接”,如...
Local Area Connection* 13
6TO4 Adapter
VMware Network Adapter VMnet1
Wireless Network Connection 2
Reusable ISATAP Interface {483968F2-DBF9-4596-B8BE-725FAAB89F93}
Local Area Connection* 3
Local Area Connection* 2
Reusable Microsoft 6To4 Adapter
Local Area Connection* 7
VMware Network Adapter VMnet8
Local Area Connection* 8
isatap.replynet.prv
Local Area Connection* 9
Local Area Connection* 12
isatap.{FAA80CE0-D641-408A-83F8-5F9C394FFD76}
Bluetooth Network Connection
Local Area Connection* 4
isatap.{40156BF9-6599-4912-A315-62DE5342B452}
isatap.{7651F2F5-4888-4258-92C5-6822C506D726}
Local Area Connection* 5
isatap.{34F5F074-8AA7-4421-AE24-131BA2DC3458}
Local Area Connection*
Local Area Connection* 10
Local Area Connection
Local Area Connection* 6
Wireless Network Connection
依旧......
EDIT2:@ ho1运行你的代码更改不存在Name的FriendlyName你会得到类似后面的列表,不幸的是它似乎不是预期的输出
0 - WAN Miniport (SSTP)
1 - WAN Miniport (IKEv2)
2 - WAN Miniport (L2TP)
3 - WAN Miniport (PPTP)
4 - WAN Miniport (PPPOE)
5 - WAN Miniport (IPv6)
6 - WAN Miniport (Network Monitor)
7 - Realtek RTL8168C(P)/8111C(P) Family PCI-E Gigabit Ethernet NIC (NDIS 6.20)
8 - WAN Miniport (IP)
9 - Microsoft ISATAP Adapter
10 - RAS Async Adapter
11 - Broadcom 802.11g Network Adapter
12 - Microsoft 6to4 Adapter
13 - VMware Virtual Ethernet Adapter for VMnet1
14 - Microsoft ISATAP Adapter #3
15 - VMware Virtual Ethernet Adapter for VMnet8
16 - Microsoft ISATAP Adapter #2
17 - Microsoft ISATAP Adapter #4
18 - Microsoft Virtual WiFi Miniport Adapter
19 - Microsoft ISATAP Adapter #5
20 - Microsoft ISATAP Adapter
22 - Bluetooth Device (Personal Area Network)
23 - Microsoft 6to4 Adapter
24 - Microsoft 6to4 Adapter #3
25 - Microsoft 6to4 Adapter #2
答案 0 :(得分:5)
正如其他人所提到的,Windows中没有“默认”NIC适配器。使用的NIC是根据目标网络(地址)和指标选择的。
例如,如果您有两个NIC和两个不同的网络:
10.1.10.1 - Local Area Connection (metric 20)
10.1.50.1 - Local Area Connection 2 (metric 10)
如果您要连接到10.1.10.15
,Windows会选择Local Area Connection
并按此方式进行路由。相反,如果您要连接到10.1.50.30
,Windows会选择Local Area Connection 2
。
现在,如果您尝试连接到74.125.67.106
(google.com),Windows会选择Local Area Connection 2
,因为它的指标值较低。
希望这有帮助。
答案 1 :(得分:2)
using System.Linq;
using System.Net.NetworkInformation;
var nic = NetworkInterface
.GetAllNetworkInterfaces()
.FirstOrDefault(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback && i.NetworkInterfaceType != NetworkInterfaceType.Tunnel);
var name = nic.Name;
或更优雅的解决方案:
.Where(i => !(
new[] { NetworkInterfaceType.Loopback, NetworkInterfaceType.Tunnel }
.Contains(i.NetworkInterfaceType)))
或者如果你想在LINQ中练习:
static IEnumerable<NetworkInterface> GetAllNetworkInterfaces(IEnumerable<NetworkInterfaceType> excludeTypes)
{
var all = NetworkInterface.GetAllNetworkInterfaces();
var exclude = all.Where(i => excludeTypes.Contains(i.NetworkInterfaceType));
return all.Except(exclude);
}
用法:
var nic = GetAllNetworkInterfaces(new[] { NetworkInterfaceType.Tunnel, NetworkInterfaceType.Loopback });
答案 2 :(得分:2)
您可以使用WMI类Win32_NetworkAdapter枚举所有适配器,并且它具有Index
属性,这可能意味着具有0或1作为Index
的那个是默认值,或其他一个属性可能有助于找到默认属性。
这样的事情可能是:
编辑:修复损坏的代码(这至少更有可能工作)。但是按照abatishchev的说法,我认为您可能需要使用Win32_NetworkAdapterConfiguration.IPConnectionMetric
来查找默认适配器......
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
foreach (ManagementObject mo in mc.GetInstances())
{
int index = Convert.ToInt32(mo["Index"]);
string name = mo["NetConnectionID"] as string;
if (!string.IsNullOrEmpty(name))
textBox1.Text += name + Environment.NewLine;
}
答案 3 :(得分:2)
这是一种肮脏的方式,因为它可以通过合并LINQ等进行优化
using System.Net.NetworkInformation;
List<NetworkInterface> Interfaces = new List<NetworkInterface>();
foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
Interfaces.Add(nic);
}
}
NetworkInterface result = null;
foreach (NetworkInterface nic in Interfaces)
{
if (result == null)
{
result = nic;
}
else
{
if (nic.GetIPProperties().GetIPv4Properties() != null)
{
if (nic.GetIPProperties().GetIPv4Properties().Index < result.GetIPProperties().GetIPv4Properties().Index)
result = nic;
}
}
}
Console.WriteLine(result.Name);
您可能希望使用nic.GetIPProperties()
和nic.GetIPProperties().GetIPv4Properties()
答案 4 :(得分:1)
我的一位朋友(Ciro D.A.)遇到了同样的问题。用c#玩一下,我们似乎找到了一种跳过虚拟(没有真正连接的Ip)的方法:我们寻找的不仅仅是那些没有它的人,还有那些有假人(0.0.0.0)的人。在我的机器上,这些最后只有两个Vm-Ware虚拟适配器。
public static void DisplayIPAddresses()
{
Console.WriteLine("\r\n****************************");
Console.WriteLine(" IPAddresses");
Console.WriteLine("****************************");
StringBuilder sb = new StringBuilder();
// Get a list of all network interfaces (usually one per network card, dialup, and VPN connection)
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface network in networkInterfaces)
{
if (network.OperationalStatus == OperationalStatus.Up )
{
if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue;
//GatewayIPAddressInformationCollection GATE = network.GetIPProperties().GatewayAddresses;
// Read the IP configuration for each network
IPInterfaceProperties properties = network.GetIPProperties();
//discard those who do not have a real gateaway
if (properties.GatewayAddresses.Count > 0)
{
bool good = false;
foreach (GatewayIPAddressInformation gInfo in properties.GatewayAddresses)
{
//not a true gateaway (VmWare Lan)
if (!gInfo.Address.ToString().Equals("0.0.0.0"))
{
sb.AppendLine(" GATEAWAY "+ gInfo.Address.ToString());
good = true;
break;
}
}
if (!good)
{
continue;
}
}
else {
continue;
}
// Each network interface may have multiple IP addresses
foreach (IPAddressInformation address in properties.UnicastAddresses)
{
// We're only interested in IPv4 addresses for now
if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue;
// Ignore loopback addresses (e.g., 127.0.0.1)
if (IPAddress.IsLoopback(address.Address)) continue;
if (!address.IsDnsEligible) continue;
if (address.IsTransient) continue;
sb.AppendLine(address.Address.ToString() + " (" + network.Name + ") nType:" + network.NetworkInterfaceType.ToString() );
}
}
}
Console.WriteLine(sb.ToString());
}
答案 5 :(得分:0)
您可以获取它们的列表,但不是默认值(也许您可以假设它是第一个条目)。
static void Main(string[] args)
{
foreach (var nc in NetworkInterface.GetAllNetworkInterfaces())
{
Console.WriteLine(nc.Name);
}
Console.ReadLine();
}