¿Cómo se puede cambiar la configuración de red (dirección IP, DNS, WINS, nombre de host) con el código en C #

Estoy desarrollando un asistente para una máquina que se utilizará como copia de seguridad de otras máquinas. Cuando reemplaza una máquina existente, necesita establecer su dirección IP, DNS, WINS y nombre de host para que coincida con la máquina que se reemplaza.

¿Hay una biblioteca en .net (C #) que me permita hacer esto programáticamente?

Hay varias NIC, cada una de las cuales debe configurarse de forma individual.

EDITAR

Gracias TimothyP por tu ejemplo. Me puso en movimiento en el camino correcto y la respuesta rápida fue increíble.

Gracias Balexandre . Tu código es perfecto Tenía prisa y ya había adaptado el ejemplo al que TimothyP estaba vinculado, pero me hubiera encantado haber tenido tu código antes.

También desarrollé una rutina usando técnicas similares para cambiar el nombre de la computadora. Lo publicaré en el futuro, así que suscríbase a este feed RSS de preguntas si desea que se lo informe. Puedo levantarlo más tarde hoy o el lunes después de un poco de limpieza.

Acabo de hacer esto en unos minutos:

using System; using System.Management; namespace WindowsFormsApplication_CS { class NetworkManagement { public void setIP(string ip_address, string subnet_mask) { ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection objMOC = objMC.GetInstances(); foreach (ManagementObject objMO in objMOC) { if ((bool)objMO["IPEnabled"]) { ManagementBaseObject setIP; ManagementBaseObject newIP = objMO.GetMethodParameters("EnableStatic"); newIP["IPAddress"] = new string[] { ip_address }; newIP["SubnetMask"] = new string[] { subnet_mask }; setIP = objMO.InvokeMethod("EnableStatic", newIP, null); } } } public void setGateway(string gateway) { ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection objMOC = objMC.GetInstances(); foreach (ManagementObject objMO in objMOC) { if ((bool)objMO["IPEnabled"]) { ManagementBaseObject setGateway; ManagementBaseObject newGateway = objMO.GetMethodParameters("SetGateways"); newGateway["DefaultIPGateway"] = new string[] { gateway }; newGateway["GatewayCostMetric"] = new int[] { 1 }; setGateway = objMO.InvokeMethod("SetGateways", newGateway, null); } } } public void setDNS(string NIC, string DNS) { ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection objMOC = objMC.GetInstances(); foreach (ManagementObject objMO in objMOC) { if ((bool)objMO["IPEnabled"]) { // if you are using the System.Net.NetworkInformation.NetworkInterface // you'll need to change this line to // if (objMO["Caption"].ToString().Contains(NIC)) // and pass in the Description property instead of the name if (objMO["Caption"].Equals(NIC)) { ManagementBaseObject newDNS = objMO.GetMethodParameters("SetDNSServerSearchOrder"); newDNS["DNSServerSearchOrder"] = DNS.Split(','); ManagementBaseObject setDNS = objMO.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } } } } public void setWINS(string NIC, string priWINS, string secWINS) { ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection objMOC = objMC.GetInstances(); foreach (ManagementObject objMO in objMOC) { if ((bool)objMO["IPEnabled"]) { if (objMO["Caption"].Equals(NIC)) { ManagementBaseObject setWINS; ManagementBaseObject wins = objMO.GetMethodParameters("SetWINSServer"); wins.SetPropertyValue("WINSPrimaryServer", priWINS); wins.SetPropertyValue("WINSSecondaryServer", secWINS); setWINS = objMO.InvokeMethod("SetWINSServer", wins, null); } } } } } } 

Refactorizado el código de balexandre un poco para que se eliminen los objetos y se usen las nuevas características de lenguaje de C # 3.5+ (Linq, var, etc.). También se cambió el nombre de las variables a nombres más significativos. También fusioné algunas de las funciones para poder hacer más configuraciones con menos interacción de WMI. Eliminé el código WINS porque ya no necesito configurar WINS. Siéntase libre de agregar el código WINS si lo necesita.

Para el caso de que a alguien le guste usar el código refactorizado / modernizado lo devuelvo a la comunidad aquí.

 ///  /// Helper class to set networking configuration like IP address, DNS servers, etc. ///  public class NetworkConfigurator { ///  /// Set's a new IP Address and it's Submask of the local machine ///  /// The IP Address /// The Submask IP Address /// The gateway. /// Requires a reference to the System.Management namespace public void SetIP(string ipAddress, string subnetMask, string gateway) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var managementObject in networkConfigs.Cast().Where(managementObject => (bool)managementObject["IPEnabled"])) { using (var newIP = managementObject.GetMethodParameters("EnableStatic")) { // Set new IP address and subnet if needed if ((!String.IsNullOrEmpty(ipAddress)) || (!String.IsNullOrEmpty(subnetMask))) { if (!String.IsNullOrEmpty(ipAddress)) { newIP["IPAddress"] = new[] { ipAddress }; } if (!String.IsNullOrEmpty(subnetMask)) { newIP["SubnetMask"] = new[] { subnetMask }; } managementObject.InvokeMethod("EnableStatic", newIP, null); } // Set mew gateway if needed if (!String.IsNullOrEmpty(gateway)) { using (var newGateway = managementObject.GetMethodParameters("SetGateways")) { newGateway["DefaultIPGateway"] = new[] { gateway }; newGateway["GatewayCostMetric"] = new[] { 1 }; managementObject.InvokeMethod("SetGateways", newGateway, null); } } } } } } } ///  /// Set's the DNS Server of the local machine ///  /// NIC address /// Comma seperated list of DNS server addresses /// Requires a reference to the System.Management namespace public void SetNameservers(string nic, string dnsServers) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var managementObject in networkConfigs.Cast().Where(objMO => (bool)objMO["IPEnabled"] && objMO["Caption"].Equals(nic))) { using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder")) { newDNS["DNSServerSearchOrder"] = dnsServers.Split(','); managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } } } } } } 

Espero que no te importe que te envíe a un ejemplo, pero este es realmente un ejemplo perfecto: http://www.codeproject.com/KB/cs/oazswitchnetconfig.aspx

Me gusta la solución WMILinq. Aunque no es exactamente la solución a su problema, busque a continuación una muestra de ello:

 using (WmiContext context = new WmiContext(@"\\.")) { context.ManagementScope.Options.Impersonation = ImpersonationLevel.Impersonate; context.Log = Console.Out; var dnss = from nic in context.Source() where nic.IPEnabled select nic; var ips = from s in dnss.SelectMany(dns => dns.DNSServerSearchOrder) select IPAddress.Parse(s); } 

http://www.codeplex.com/linq2wmi

El cambio dynamic de IP en C # es muy fácil …

Mire el siguiente código y visite: http://microsoftdotnetsolutions.blogspot.in/2012/12/dynamic-ip-change-in-c.html

Las respuestas existentes tienen un código bastante roto. El método DNS no funciona en absoluto. Aquí hay un código que utilicé para configurar mi NIC:

 public static class NetworkConfigurator { ///  /// Set's a new IP Address and it's Submask of the local machine ///  /// The IP Address /// The Submask IP Address /// The gateway. ///  /// Requires a reference to the System.Management namespace public static void SetIP(string nicDescription, string[] ipAddresses, string subnetMask, string gateway) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var managementObject in networkConfigs.Cast().Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription)) { using (var newIP = managementObject.GetMethodParameters("EnableStatic")) { // Set new IP address and subnet if needed if (ipAddresses != null || !String.IsNullOrEmpty(subnetMask)) { if (ipAddresses != null) { newIP["IPAddress"] = ipAddresses; } if (!String.IsNullOrEmpty(subnetMask)) { newIP["SubnetMask"] = Array.ConvertAll(ipAddresses, _ => subnetMask); } managementObject.InvokeMethod("EnableStatic", newIP, null); } // Set mew gateway if needed if (!String.IsNullOrEmpty(gateway)) { using (var newGateway = managementObject.GetMethodParameters("SetGateways")) { newGateway["DefaultIPGateway"] = new[] { gateway }; newGateway["GatewayCostMetric"] = new[] { 1 }; managementObject.InvokeMethod("SetGateways", newGateway, null); } } } } } } } ///  /// Set's the DNS Server of the local machine ///  /// NIC address /// Comma seperated list of DNS server addresses /// Requires a reference to the System.Management namespace public static void SetNameservers(string nicDescription, string[] dnsServers) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var managementObject in networkConfigs.Cast().Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription)) { using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder")) { newDNS["DNSServerSearchOrder"] = dnsServers; managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } } } } } } 

Un ejemplo un poco más conciso que se basa en las otras respuestas aquí. Aproveché la generación de código que se incluye con Visual Studio para eliminar la mayor parte del código de invocación adicional y reemplazarlo con objetos tipados.

  using System; using System.Management; namespace Utils { class NetworkManagement { ///  /// Returns a list of all the network interface class names that are currently enabled in the system ///  /// list of nic names public static string[] GetAllNicDescriptions() { List nics = new List(); using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var config in networkConfigs.Cast() .Where(mo => (bool)mo["IPEnabled"]) .Select(x=> new NetworkAdapterConfiguration(x))) { nics.Add(config.Description); } } } return nics.ToArray(); } ///  /// Set's the DNS Server of the local machine ///  /// The full description of the network interface class /// Comma seperated list of DNS server addresses /// Requires a reference to the System.Management namespace public static bool SetNameservers(string nicDescription, string[] dnsServers, bool restart = false) { using (ManagementClass networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (ManagementObjectCollection networkConfigs = networkConfigMng.GetInstances()) { foreach (ManagementObject mboDNS in networkConfigs.Cast().Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription)) { // NAC class was generated by opening a developer console and entering: // mgmtclassgen Win32_NetworkAdapterConfiguration -p NetworkAdapterConfiguration.cs // See: http://blog.opennetcf.com/2008/06/24/disableenable-network-connections-under-vista/ using (NetworkAdapterConfiguration config = new NetworkAdapterConfiguration(mboDNS)) { if (config.SetDNSServerSearchOrder(dnsServers) == 0) { RestartNetworkAdapter(nicDescription); } } } } } return false; } ///  /// Restarts a given Network adapter ///  /// The full description of the network interface class public static void RestartNetworkAdapter(string nicDescription) { using (ManagementClass networkConfigMng = new ManagementClass("Win32_NetworkAdapter")) { using (ManagementObjectCollection networkConfigs = networkConfigMng.GetInstances()) { foreach (ManagementObject mboDNS in networkConfigs.Cast().Where(mo=> (string)mo["Description"] == nicDescription)) { // NA class was generated by opening dev console and entering // mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs using (NetworkAdapter adapter = new NetworkAdapter(mboDNS)) { adapter.Disable(); adapter.Enable(); Thread.Sleep(4000); // Wait a few secs until exiting, this will give the NIC enough time to re-connect return; } } } } } ///  /// Get's the DNS Server of the local machine ///  /// The full description of the network interface class public static string[] GetNameservers(string nicDescription) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var config in networkConfigs.Cast() .Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription) .Select( x => new NetworkAdapterConfiguration(x))) { return config.DNSServerSearchOrder; } } } return null; } ///  /// Set's a new IP Address and it's Submask of the local machine ///  /// The full description of the network interface class /// The IP Address /// The Submask IP Address /// The gateway. /// Requires a reference to the System.Management namespace public static void SetIP(string nicDescription, string[] ipAddresses, string subnetMask, string gateway) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var config in networkConfigs.Cast() .Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription) .Select( x=> new NetworkAdapterConfiguration(x))) { // Set the new IP and subnet masks if needed config.EnableStatic(ipAddresses, Array.ConvertAll(ipAddresses, _ => subnetMask)); // Set mew gateway if needed if (!String.IsNullOrEmpty(gateway)) { config.SetGateways(new[] {gateway}, new ushort[] {1}); } } } } } } } 

Fuente completa: https://github.com/sverrirs/DnsHelper/blob/master/src/DnsHelperUI/NetworkManagement.cs