在自動化部署、嵌入式裝置或無人值守安裝案例中,常需以程式碼調整網路卡的 IP 位址、子網路遮罩、預設閘道與 DNS 伺服器。.NET 透過 System.Management 命名空間存取 WMI Win32_NetworkAdapterConfiguration 類別,即可完成這些設定,且支援啟用/停用 DHCP。
以下封裝常用操作的靜態方法,參數皆採用字串陣列以支援多 IP、多 DNS 等進階情境:
using System;
using System.Management;
using System.Text.RegularExpressions;
public class NetworkSetting
{
// 設定 DNS
public static void SetDNS(string[] dns) => SetIPAddress(null, null, null, dns);
// 設定閘道 (單一或多組)
public static void SetGetWay(string gateway) => SetIPAddress(null, null, new[] { gateway }, null);
public static void SetGetWay(string[] gateway) => SetIPAddress(null, null, gateway, null);
// 設定 IP 與子網路遮罩
public static void SetIPAddress(string ip, string mask) => SetIPAddress(new[] { ip }, new[] { mask }, null, null);
public static void SetIPAddress(string ip, string mask, string gateway) => SetIPAddress(new[] { ip }, new[] { mask }, new[] { gateway }, null);
// 完整設定:IP、遮罩、閘道、DNS
public static void SetIPAddress(string[] ip, string[] mask, string[] gateway, string[] dns)
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
// 僅處理已啟用 IP 的網路卡
if (!(bool)mo["IPEnabled"]) continue;
// 1. 設定靜態 IP 與遮罩
if (ip != null && mask != null)
{
ManagementBaseObject inPar = mo.GetMethodParameters("EnableStatic");
inPar["IPAddress"] = ip;
inPar["SubnetMask"] = mask;
mo.InvokeMethod("EnableStatic", inPar, null);
}
// 2. 設定預設閘道
if (gateway != null)
{
ManagementBaseObject inPar = mo.GetMethodParameters("SetGateways");
inPar["DefaultIPGateway"] = gateway;
mo.InvokeMethod("SetGateways", inPar, null);
}
// 3. 設定 DNS 伺服器搜尋順序
if (dns != null)
{
ManagementBaseObject inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
inPar["DNSServerSearchOrder"] = dns;
mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null);
}
}
}
// 啟用 DHCP (並清除靜態 DNS)
public static void EnableDHCP()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mo in mc.GetInstances())
{
if (!(bool)mo["IPEnabled"]) continue;
mo.InvokeMethod("SetDNSServerSearchOrder", null);
mo.InvokeMethod("EnableDHCP", null);
}
}
// 簡易 IP 格式驗證
public static bool IsIPAddress(string ip)
{
string[] parts = ip.Split('.');
if (parts.Length != 4) return false;
string pattern = @"\d{1,3}";
for (int i = 0; i < 4; i++)
{
if (!Regex.IsMatch(parts[i], pattern)) return false;
if (i == 0 && parts[i] == "0") return false;
string trimmed = parts[i].TrimStart('0');
if (trimmed == "") return false;
if (int.Parse(trimmed) > 255) return false;
}
return true;
}
}
// 設定靜態 IP
NetworkSetting.SetIPAddress("192.168.1.100", "255.255.255.0", "192.168.1.1", new[] { "8.8.8.8", "8.8.4.4" });
// 僅變更 DNS
NetworkSetting.SetDNS(new[] { "1.1.1.1", "1.0.0.1" });
// 改回 DHCP
NetworkSetting.EnableDHCP();
IPEnabled=true 的網路卡,若需針對特定網路卡,可依據 Description、MACAddress 或 SettingID 篩選。Task.Run 避免阻塞 UI。InvokeMethod 回傳的 ManagementBaseObject 含 ReturnValue 屬性,0 代表成功,其他代碼請參考 MSDN Win32_NetworkAdapterConfiguration 文件。透過 WMI Win32_NetworkAdapterConfiguration,C# 可以完整掌控本機網路設定,適合自動化部署工具、網路診斷程式或 IoT 裝置設定介面。記得搭配管理員權限與例外處理,即可穩定運作於各種 Windows 環境。