如何用C#中的代码更改networking设置(IP地址,DNS,WINS,主机名)

我正在开发一个用于其他机器备份的机器的向导。 当它replace现有的机器时,需要设置其IP地址,DNS,WINS和主机名称以匹配被更换的机器。

.net(C#)中有一个库,它允许我以编程方式执行此操作?

有多个NIC,每个需要单独设置。

编辑

谢谢你的例子TimothyP 。 它让我走在正确的轨道上,快速的回复是真棒。

谢谢balexandre 。 你的代码是完美的。 我很忙,已经适应了TimothyP链接的例子,但是我希望能早日得到你的代码。

我还开发了一个使用类似技术来改变计算机名称的例程。 我将在未来发布,所以如果您想要了解更新,请订阅此问题的RSS提要 。 我可能会在今天晚些时候或星期一清理一下之后才能清理它。

刚刚在几分钟内做了这个:

using System; using System.Management; namespace WindowsFormsApplication_CS { class NetworkManagement { /// <summary> /// Set's a new IP Address and it's Submask of the local machine /// </summary> /// <param name="ip_address">The IP Address</param> /// <param name="subnet_mask">The Submask IP Address</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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"]) { try { 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); } catch (Exception) { throw; } } } } /// <summary> /// Set's a new Gateway address of the local machine /// </summary> /// <param name="gateway">The Gateway IP Address</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> public void setGateway(string gateway) { ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection objMOC = objMC.GetInstances(); foreach (ManagementObject objMO in objMOC) { if ((bool)objMO["IPEnabled"]) { try { ManagementBaseObject setGateway; ManagementBaseObject newGateway = objMO.GetMethodParameters("SetGateways"); newGateway["DefaultIPGateway"] = new string[] { gateway }; newGateway["GatewayCostMetric"] = new int[] { 1 }; setGateway = objMO.InvokeMethod("SetGateways", newGateway, null); } catch (Exception) { throw; } } } } /// <summary> /// Set's the DNS Server of the local machine /// </summary> /// <param name="NIC">NIC address</param> /// <param name="DNS">DNS server address</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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)) { try { ManagementBaseObject newDNS = objMO.GetMethodParameters("SetDNSServerSearchOrder"); newDNS["DNSServerSearchOrder"] = DNS.Split(','); ManagementBaseObject setDNS = objMO.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } catch (Exception) { throw; } } } } } /// <summary> /// Set's WINS of the local machine /// </summary> /// <param name="NIC">NIC Address</param> /// <param name="priWINS">Primary WINS server address</param> /// <param name="secWINS">Secondary WINS server address</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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)) { try { ManagementBaseObject setWINS; ManagementBaseObject wins = objMO.GetMethodParameters("SetWINSServer"); wins.SetPropertyValue("WINSPrimaryServer", priWINS); wins.SetPropertyValue("WINSSecondaryServer", secWINS); setWINS = objMO.InvokeMethod("SetWINSServer", wins, null); } catch (Exception) { throw; } } } } } } } 

重构了balexandre中的代码,使得对象得到处理,并使用C#3.5+的新语言特性(Linq,var等)。 也将variables重命名为更有意义的名称。 我还合并了一些function,以便能够以较less的WMI交互进行更多的configuration。 我删除了WINS代码,因为我不需要再configurationWINS。 如果您需要,可以随意添加WINS代码。

对于任何人喜欢使用重构/现代化的代码,我把它放回到社区这里。

 /// <summary> /// Helper class to set networking configuration like IP address, DNS servers, etc. /// </summary> public class NetworkConfigurator { /// <summary> /// Set's a new IP Address and it's Submask of the local machine /// </summary> /// <param name="ipAddress">The IP Address</param> /// <param name="subnetMask">The Submask IP Address</param> /// <param name="gateway">The gateway.</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>().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); } } } } } } } /// <summary> /// Set's the DNS Server of the local machine /// </summary> /// <param name="nic">NIC address</param> /// <param name="dnsServers">Comma seperated list of DNS server addresses</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>().Where(objMO => (bool)objMO["IPEnabled"] && objMO["Caption"].Equals(nic))) { using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder")) { newDNS["DNSServerSearchOrder"] = dnsServers.Split(','); managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } } } } } } 

我希望你不介意我给你发个例子,但是这真是一个完美的例子: http : //www.codeproject.com/KB/cs/oazswitchnetconfig.aspx

我喜欢WMILinq解决scheme。 虽然不完全是解决您的问题,但find下面的味道:

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

http://www.codeplex.com/linq2wmi

dynamicip在c#中的变化是很容易的… … –

请看下面的代码并访问。 http://microsoftdotnetsolutions.blogspot.in/2012/12/dynamic-ip-change-in-c.html

现有的答案有相当破碎的代码。 DNS方法根本不起作用。 这是我用来configuration我的网卡的代码:

 public static class NetworkConfigurator { /// <summary> /// Set's a new IP Address and it's Submask of the local machine /// </summary> /// <param name="ipAddress">The IP Address</param> /// <param name="subnetMask">The Submask IP Address</param> /// <param name="gateway">The gateway.</param> /// <param name="nicDescription"></param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>().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); } } } } } } } /// <summary> /// Set's the DNS Server of the local machine /// </summary> /// <param name="nic">NIC address</param> /// <param name="dnsServers">Comma seperated list of DNS server addresses</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>().Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription)) { using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder")) { newDNS["DNSServerSearchOrder"] = dnsServers; managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); } } } } } } 

一个稍微更简洁的例子,build立在这里的其他答案的顶部。 我利用Visual Studio附带的代码生成function去除大部分额外的调用代码,并用types化的对象代替它。

  using System; using System.Management; namespace Utils { class NetworkManagement { /// <summary> /// Returns a list of all the network interface class names that are currently enabled in the system /// </summary> /// <returns>list of nic names</returns> public static string[] GetAllNicDescriptions() { List<string> nics = new List<string>(); using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var config in networkConfigs.Cast<ManagementObject>() .Where(mo => (bool)mo["IPEnabled"]) .Select(x=> new NetworkAdapterConfiguration(x))) { nics.Add(config.Description); } } } return nics.ToArray(); } /// <summary> /// Set's the DNS Server of the local machine /// </summary> /// <param name="nicDescription">The full description of the network interface class</param> /// <param name="dnsServers">Comma seperated list of DNS server addresses</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>().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; } /// <summary> /// Restarts a given Network adapter /// </summary> /// <param name="nicDescription">The full description of the network interface class</param> public static void RestartNetworkAdapter(string nicDescription) { using (ManagementClass networkConfigMng = new ManagementClass("Win32_NetworkAdapter")) { using (ManagementObjectCollection networkConfigs = networkConfigMng.GetInstances()) { foreach (ManagementObject mboDNS in networkConfigs.Cast<ManagementObject>().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; } } } } } /// <summary> /// Get's the DNS Server of the local machine /// </summary> /// <param name="nicDescription">The full description of the network interface class</param> public static string[] GetNameservers(string nicDescription) { using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration")) { using (var networkConfigs = networkConfigMng.GetInstances()) { foreach (var config in networkConfigs.Cast<ManagementObject>() .Where(mo => (bool)mo["IPEnabled"] && (string)mo["Description"] == nicDescription) .Select( x => new NetworkAdapterConfiguration(x))) { return config.DNSServerSearchOrder; } } } return null; } /// <summary> /// Set's a new IP Address and it's Submask of the local machine /// </summary> /// <param name="nicDescription">The full description of the network interface class</param> /// <param name="ipAddresses">The IP Address</param> /// <param name="subnetMask">The Submask IP Address</param> /// <param name="gateway">The gateway.</param> /// <remarks>Requires a reference to the System.Management namespace</remarks> 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<ManagementObject>() .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}); } } } } } } } 

完整源代码: https : //github.com/sverrirs/DnsHelper/blob/master/src/DnsHelperUI/NetworkManagement.cs