c# - Cómo obtener el nombre de conexión de NIC predeterminado
command-line netsh (6)
EDITAR IMPORTANTE: Vuelve sobre este tema. Como dijo no debería haber una NIC predeterminada, estoy tratando de entender si hay una manera de detectar todas las NIC que están realmente conectadas.
Al tener la dirección MAC de mi interfaz física, hay una forma programática de obtener el nombre de la interfaz / estado de la interfaz / etc ...
Por ejemplo, mi máquina XP:
Dispositivo Realtek RTL8139 Familia PCI Fast Ethernet NIC MAC XXXX-XXXX-XXXX
XXXX-XXXX-XXXX es lo que sé
A través de este dispositivo me conecto utilizando la conexión "Conexión de área local" (con toda la información relacionada como puerta de enlace, subred, ...)
Así que estoy buscando el enlace entre XXXX-XXXX-XXXX y la Conexión de área local.
Espero que todo esté claro ahora.
¡Gracias a todos! PD: Perdón por el retraso ... +1 voto a todos, ¡por paciencia!
Vieja pregunta
Hola a todos, me gustaría cambiar la IP de "Conexión de área local" utilizando el comando netsh.
Mi problema es ¿existe una forma programática de obtener el nombre de conexión predeterminado (es decir, exactamente "Conexión de área local")?
Gracias
EDITAR: No necesito la lista de todos los nombres de conexión sino solo la predeterminada. Al acceder al registro, aparece la lista y parece que el valor predeterminado está marcado con un *. Desafortunadamente, imprimiéndolos en una consola obtengo una especie de 10 "Conexiones de área local" diferentes como ...
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
y así...
EDIT2: @ ho1 ejecutando tu código cambiando FriendlyName que no existe con Name obtendrás algo así como la lista, lamentablemente no parece ser el resultado esperado
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
Puede obtener una lista de ellos, pero no la predeterminada (quizás pueda suponer que es la primera entrada).
static void Main(string[] args)
{
foreach (var nc in NetworkInterface.GetAllNetworkInterfaces())
{
Console.WriteLine(nc.Name);
}
Console.ReadLine();
}
Puede usar la clase WMI Win32_NetworkAdapter para enumerar todos los adaptadores y tiene una propiedad Index
que puede significar que la que tiene 0 o 1 como Index
es la predeterminada, o una de las otras propiedades puede ayudar a encontrar la predeterminada.
Algo como esto tal vez:
Editar: se corrigió el código roto (al menos es más probable que funcione). Pero siguiendo lo que dijo abatishchev, creo que es posible que necesite usar Win32_NetworkAdapterConfiguration.IPConnectionMetric
para encontrar el adaptador predeterminado ...
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;
}
Como han mencionado otros, no hay un adaptador de NIC "predeterminado" en Windows. La NIC utilizada se elige en función de la red de destino (dirección) y la métrica.
Por ejemplo, si tiene dos NIC y dos redes diferentes:
10.1.10.1 - Local Area Connection (metric 20)
10.1.50.1 - Local Area Connection 2 (metric 10)
Y desea conectarse a 10.1.10.15
, Windows elegirá la Local Area Connection
y la ruta de esa manera. Por el contrario, si desea conectarse a 10.1.50.30
, Windows elegirá la Local Area Connection 2
.
Ahora, si intenta conectarse a 74.125.67.106
(google.com), Windows elegirá la Local Area Connection 2
porque tiene un valor de métrica inferior.
EDITAR: Aquí hay un excelente artículo que explica el enrutamiento: http://www.windowsnetworking.com/articles_tutorials/Making-Sense-Windows-Routing-Tables.html
EDIT2: ortografía.
Espero que esto ayude.
Esta es una forma sucia de hacerlo, ya que puede optimizarse incorporando LINQ, etc.
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);
Es probable que desee adaptar sus resultados utilizando los resultados de nic.GetIPProperties()
y nic.GetIPProperties().GetIPv4Properties()
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;
o una solución más elegante:
.Where(i => !(
new[] { NetworkInterfaceType.Loopback, NetworkInterfaceType.Tunnel }
.Contains(i.NetworkInterfaceType)))
o si quieres practicar en 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);
}
Uso:
var nic = GetAllNetworkInterfaces(new[] { NetworkInterfaceType.Tunnel, NetworkInterfaceType.Loopback });
Un amigo mío (Ciro DA) tenía el mismo problema. Jugando un poco con c #, parecíamos encontrar una manera de omitir virtual (Ip no realmente conectado): buscamos descarte de puerta de enlace no solo de aquellos que no lo tenían, sino también de aquellos que tenían un maniquí (0.0.0.0) . En mi máquina, estos últimos eran exactamente dos adaptadores virtuales de 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());
}