c# command-line netsh

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()); }