在開發系統管理工具或網路設定小程式時,常需要以程式碼動態變更網路介面卡的 IP 位址、子網路遮罩、預設閘道與 DNS 伺服器。C# 透過 System.Management 命名空間呼叫 WMI (Windows Management Instrumentation) 的 Win32_NetworkAdapterConfiguration 類別,即可在不重開機的情況下完成這些設定。本文將完整示範如何封裝一個可重複使用的網路設定工具類別。
以下程式碼展示關鍵邏輯:啟用靜態 IP、設定閘道、設定 DNS,以及提供一鍵切回 DHCP 的方法。
using System;
using System.Management;
public class NetworkConfigurator
{
private ManagementObjectCollection moc;
public NetworkConfigurator()
{
// 取得所有啟用 IP 的網路介面卡
var query = new ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE");
var searcher = new ManagementObjectSearcher(query);
moc = searcher.Get();
}
///
/// 設定靜態 IP、子網路遮罩、閘道與 DNS
///
public void SetStaticIP(string ipAddress, string subnetMask, string gateway, string[] dnsServers)
{
foreach (ManagementObject mo in moc)
{
if (!(bool)mo["IPEnabled"]) continue;
// 1. 啟用靜態 IP
var inParams = mo.GetMethodParameters("EnableStatic");
inParams["IPAddress"] = new[] { ipAddress };
inParams["SubnetMask"] = new[] { subnetMask };
mo.InvokeMethod("EnableStatic", inParams, null);
// 2. 設定預設閘道
inParams = mo.GetMethodParameters("SetGateways");
inParams["DefaultIPGateway"] = new[] { gateway };
inParams["GatewayCostMetric"] = new[] { 1 };
mo.InvokeMethod("SetGateways", inParams, null);
// 3. 設定 DNS 伺服器搜尋順序
inParams = mo.GetMethodParameters("SetDNSServerSearchOrder");
inParams["DNSServerSearchOrder"] = dnsServers;
mo.InvokeMethod("SetDNSServerSearchOrder", inParams, null);
}
}
///
/// 切換回 DHCP 自動取得 IP
///
public void EnableDHCP()
{
foreach (ManagementObject mo in moc)
{
if (!(bool)mo["IPEnabled"]) continue;
if (!(bool)mo["DHCPEnabled"])
{
var inParams = mo.GetMethodParameters("EnableDHCP");
mo.InvokeMethod("EnableDHCP", inParams, null);
}
}
}
}
var config = new NetworkConfigurator();
// 設定靜態 IP
config.SetStaticIP("192.168.1.100", "255.255.255.0", "192.168.1.1", new[] { "8.8.8.8", "8.8.4.4" });
// 或切回 DHCP
config.EnableDHCP();
Win32_NetworkAdapterConfiguration 會全部套用;實務上建依據 Description 或 MACAddress 先行篩選目標網卡。透過 WMI 的 Win32_NetworkAdapterConfiguration 類別,我們能以純 C# 程式碼完整掌控網路卡的 IP 設定,適用於自動化部署、網路切換工具或嵌入式裝置的網路配置功能。