c# .net wmi

c# - La mejor manera de configurar adaptadores de red mediante programación en.NET



wmi (5)

Con la ayuda de las respuestas de @ PaulB.

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address " + nics[0].Name + " static 192.168." + provider_ip + "." + index + " 255.255.255.0 192.168." + provider_ip + ".1 1"); p.StartInfo = psi; p.StartInfo.Verb = "runas"; p.Start();

Tengo una aplicación escrita en C # que necesita poder configurar los adaptadores de red en Windows. Básicamente, tengo esto funcionando a través de WMI, pero hay un par de cosas que no me gustan de esa solución: a veces las configuraciones no parecen mantenerse, y cuando el cable de red no está enchufado, los errores son devueltos desde la WMI. Métodos, así que no puedo decir si realmente tuvieron éxito o no.

Necesito poder configurar todos los ajustes disponibles a través de las conexiones de red - Propiedades - Pantallas TCP / IP.

¿Cuál es la mejor manera de hacer esto?


Con mi código SetIpAddress y SetDHCP

/// <summary> /// Sets the ip address. /// </summary> /// <param name="nicName">Name of the nic.</param> /// <param name="ipAddress">The ip address.</param> /// <param name="subnetMask">The subnet mask.</param> /// <param name="gateway">The gateway.</param> /// <param name="dns1">The DNS1.</param> /// <param name="dns2">The DNS2.</param> /// <returns></returns> public static bool SetIpAddress( string nicName, string ipAddress, string subnetMask, string gateway = null, string dns1 = null, string dns2 = null) { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); string nicDesc = nicName; if (networkInterface != null) { nicDesc = networkInterface.Description; } foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true && mo["Description"].Equals(nicDesc) == true) { try { ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic"); newIP["IPAddress"] = new string[] { ipAddress }; newIP["SubnetMask"] = new string[] { subnetMask }; ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null); if (gateway != null) { ManagementBaseObject newGateway = mo.GetMethodParameters("SetGateways"); newGateway["DefaultIPGateway"] = new string[] { gateway }; newGateway["GatewayCostMetric"] = new int[] { 1 }; ManagementBaseObject setGateway = mo.InvokeMethod("SetGateways", newGateway, null); } if (dns1 != null || dns2 != null) { ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder"); var dns = new List<string>(); if (dns1 != null) { dns.Add(dns1); } if (dns2 != null) { dns.Add(dns2); } newDns["DNSServerSearchOrder"] = dns.ToArray(); ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null); } } catch { return false; } } } return true; } /// <summary> /// Sets the DHCP. /// </summary> /// <param name="nicName">Name of the nic.</param> public static bool SetDHCP(string nicName) { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); string nicDesc = nicName; if (networkInterface != null) { nicDesc = networkInterface.Description; } foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true && mo["Description"].Equals(nicDesc) == true) { try { ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder"); newDNS["DNSServerSearchOrder"] = null; ManagementBaseObject enableDHCP = mo.InvokeMethod("EnableDHCP", null, null); ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } catch { return false; } } } return true; }



Puedo decirle que la forma en que lo hacen los troyanos, después de tener que limpiar algunos de ellos, es establecer las claves de registro en HKEY_LOCAL_MACHINE. Los principales que configuran son los DNS y ese enfoque se adhiere definitivamente a cualquiera que haya sido infectado y ya no pueda acceder a windowsupdate.com, mcafee.com, etc.


Podría usar el Process para activar los comandos netsh para establecer todas las propiedades en los diálogos de la red.

Por ejemplo: para establecer una dirección IP estática en un adaptador

netsh interface ip set address "Local Area Connection" static 192.168.0.10 255.255.255.0 192.168.0.1 1

Para configurarlo a dhcp utilizarías

netsh interface ip set address "Local Area Connection" dhcp

Hacerlo desde C # seria

Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface ip set address /"Local Area Connection/" static 192.168.0.10 255.255.255.0 192.168.0.1 1"); p.StartInfo = psi; p.Start();

La configuración de estática puede tardar un par de segundos en completarse, de modo que si lo necesita, asegúrese de esperar a que finalice el proceso.