How can you change Network settings (IP Address, DNS, WINS, Host Name) with code in C#
Categories:
Programmatically Configure Network Settings in C#

Learn how to dynamically change IP addresses, DNS servers, WINS settings, and hostnames on Windows systems using C# and WMI.
Modifying network settings programmatically in C# can be a powerful tool for system administrators, developers creating deployment scripts, or applications requiring dynamic network adjustments. This article will guide you through using Windows Management Instrumentation (WMI) to change common network configurations such as IP addresses, DNS servers, WINS settings, and the computer's hostname. While powerful, these operations require administrative privileges and should be handled with care.
Understanding WMI for Network Configuration
Windows Management Instrumentation (WMI) is Microsoft's implementation of Web-Based Enterprise Management (WBEM), a standard for accessing management information in an enterprise environment. It provides a unified way to manage local and remote computers. For network settings, we primarily interact with the Win32_NetworkAdapterConfiguration
class, which exposes methods to modify IP, DNS, and WINS settings. Hostname changes involve the Win32_ComputerSystem
class.
flowchart TD A[Start] --> B{Identify Network Adapter} B --> C{Get Win32_NetworkAdapterConfiguration} C --> D{Set IP Address/Subnet/Gateway} C --> E{Set DNS Servers} C --> F{Set WINS Servers} D --> G[Apply Changes] E --> G F --> G G --> H{Change Hostname (if needed)} H --> I[Reboot (if needed)] I --> J[End]
Workflow for Programmatic Network Configuration in C#
Changing IP Address, Subnet Mask, and Gateway
The Win32_NetworkAdapterConfiguration
class provides the EnableStatic
method to set a static IP address, subnet mask, and default gateway. This method takes arrays of strings for each parameter, allowing you to configure multiple IP addresses or gateways if necessary, though typically only one is used.
using System.Management;
public static void SetIPAddress(string ipAddress, string subnetMask, string gateway)
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
// Filter for active Ethernet adapters (you might need more robust filtering)
if ((bool)mo["IPEnabled"])
{
ManagementBaseObject newIP = mo.InvokeMethod("EnableStatic", new object[] { new string[] { ipAddress }, new string[] { subnetMask } });
ManagementBaseObject newGateway = mo.InvokeMethod("SetGateways", new object[] { new string[] { gateway } });
Console.WriteLine($"IP Address set result: {newIP["ReturnValue"]}");
Console.WriteLine($"Gateway set result: {newGateway["ReturnValue"]}");
break; // Assuming we only want to configure the first enabled adapter
}
}
}
C# code to set a static IP address, subnet mask, and default gateway.
Configuring DNS Servers
Similar to IP addresses, DNS servers are configured using the SetDNSServerSearchOrder
method of the Win32_NetworkAdapterConfiguration
class. This method accepts an array of strings, allowing you to specify primary and secondary DNS servers.
using System.Management;
public static void SetDNSServers(string[] dnsServers)
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
ManagementBaseObject newDNS = mo.InvokeMethod("SetDNSServerSearchOrder", new object[] { dnsServers });
Console.WriteLine($"DNS Servers set result: {newDNS["ReturnValue"]}");
break;
}
}
}
C# code to set primary and secondary DNS server addresses.
Setting WINS Servers
WINS (Windows Internet Name Service) is an older name resolution service, but some legacy environments still use it. You can configure primary and secondary WINS servers using the SetWINSServerSearchOrder
method.
using System.Management;
public static void SetWINSServers(string[] winsServers)
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
ManagementBaseObject newWINS = mo.InvokeMethod("SetWINSServerSearchOrder", new object[] { winsServers });
Console.WriteLine($"WINS Servers set result: {newWINS["ReturnValue"]}");
break;
}
}
}
C# code to set primary and secondary WINS server addresses.
Changing the Computer Hostname
Changing the computer's hostname involves the Win32_ComputerSystem
class and its Rename
method. This operation typically requires a system reboot to take full effect.
using System.Management;
public static void ChangeHostname(string newHostname)
{
ManagementObject mo = new ManagementObject("Win32_ComputerSystem.Name='" + Environment.MachineName + "'");
ManagementBaseObject outParams = mo.InvokeMethod("Rename", new object[] { newHostname, null, null });
uint returnValue = (uint)outParams["ReturnValue"];
Console.WriteLine($"Hostname change result: {returnValue}");
if (returnValue == 0) // Success
{
Console.WriteLine("Hostname changed successfully. A reboot is required for the change to take effect.");
}
else
{
Console.WriteLine($"Failed to change hostname. Error code: {returnValue}");
}
}
C# code to change the computer's hostname.
Win32_OperatingSystem
's Reboot
method, but ensure proper user notification and consent.Putting It All Together: A Comprehensive Example
Here's a consolidated example demonstrating how you might combine these operations. Remember to add a reference to System.Management
in your project.
using System;
using System.Management;
public class NetworkConfigurator
{
public static void Main(string[] args)
{
// Example usage:
// SetIPAddress("192.168.1.100", "255.255.255.0", "192.168.1.1");
// SetDNSServers(new string[] { "8.8.8.8", "8.8.4.4" });
// SetWINSServers(new string[] { "192.168.1.200" });
// ChangeHostname("NEW-PC-NAME");
Console.WriteLine("Network configuration operations completed. Check console for results.");
Console.WriteLine("Remember to run as administrator and reboot if hostname changed.");
}
public static void SetIPAddress(string ipAddress, string subnetMask, string gateway)
{
try
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
Console.WriteLine($"Configuring adapter: {mo["Description"]}");
ManagementBaseObject newIP = mo.InvokeMethod("EnableStatic", new object[] { new string[] { ipAddress }, new string[] { subnetMask } });
ManagementBaseObject newGateway = mo.InvokeMethod("SetGateways", new object[] { new string[] { gateway } });
Console.WriteLine($" IP Address set result: {newIP["ReturnValue"]}");
Console.WriteLine($" Gateway set result: {newGateway["ReturnValue"]}");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error setting IP address: {ex.Message}");
}
}
public static void SetDNSServers(string[] dnsServers)
{
try
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
Console.WriteLine($"Configuring DNS for adapter: {mo["Description"]}");
ManagementBaseObject newDNS = mo.InvokeMethod("SetDNSServerSearchOrder", new object[] { dnsServers });
Console.WriteLine($" DNS Servers set result: {newDNS["ReturnValue"]}");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error setting DNS servers: {ex.Message}");
}
}
public static void SetWINSServers(string[] winsServers)
{
try
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
Console.WriteLine($"Configuring WINS for adapter: {mo["Description"]}");
ManagementBaseObject newWINS = mo.InvokeMethod("SetWINSServerSearchOrder", new object[] { winsServers });
Console.WriteLine($" WINS Servers set result: {newWINS["ReturnValue"]}");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error setting WINS servers: {ex.Message}");
}
}
public static void ChangeHostname(string newHostname)
{
try
{
ManagementObject mo = new ManagementObject("Win32_ComputerSystem.Name='" + Environment.MachineName + "'");
ManagementBaseObject outParams = mo.InvokeMethod("Rename", new object[] { newHostname, null, null });
uint returnValue = (uint)outParams["ReturnValue"];
Console.WriteLine($"Hostname change result: {returnValue}");
if (returnValue == 0)
{
Console.WriteLine("Hostname changed successfully. A reboot is required.");
}
else
{
Console.WriteLine($"Failed to change hostname. Error code: {returnValue}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error changing hostname: {ex.Message}");
}
}
}
A complete C# example demonstrating how to use WMI to modify various network settings.