在 Windows 環境下,網路介面卡的 IP 設定涉及底層硬體操作,C# 沒有直接的 Managed API。解決方案是透過 WMI (Windows Management Instrumentation) 呼叫 Win32_NetworkAdapterConfiguration 管理類別,執行 ReleaseDHCPLease(釋放)與 RenewDHCPLease(續約)方法。
using System;
using System.Collections.Generic;
using System.Management;
namespace IPManager
{
public class DhcpController
{
///
/// 取得所有啟用 IP 的網卡描述與 ManagementObject 對應
///
public static Dictionary<string, ManagementObject> GetEnabledAdapters()
{
var adapters = new Dictionary<string, ManagementObject>();
var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
foreach (ManagementObject mo in mc.GetInstances())
{
if ((bool)mo["IPEnabled"])
adapters[(string)mo["Description"]] = mo;
}
return adapters;
}
///
/// 釋放指定網卡的 DHCP 租約
///
public static bool Release(ManagementObject adapter)
{
var result = adapter.InvokeMethod("ReleaseDHCPLease", null);
return (uint)result["ReturnValue"] < 2; // 0,1 代表成功
}
///
/// 續約指定網卡的 DHCP 租約
///
public static bool Renew(ManagementObject adapter)
{
var result = adapter.InvokeMethod("RenewDHCPLease", null);
return (uint)result["ReturnValue"] < 2;
}
}
// 主控台互動測試
class Program
{
static void Main()
{
var adapters = DhcpController.GetEnabledAdapters();
if (adapters.Count == 0)
{
Console.WriteLine("找無啟用 IP 的網卡。");
return;
}
var descList = new List<string>(adapters.Keys);
for (int i = 0; i < descList.Count; i++)
Console.WriteLine($"{i}: {descList[i]}");
while (true)
{
Console.Write("\n請輸入編號選擇網卡 (q 離開):");
var input = Console.ReadLine();
if (input?.ToLower() == "q") break;
if (!int.TryParse(input, out int idx) || idx < 0 || idx >= descList.Count)
{
Console.WriteLine("編號錯誤,請重輸。");
continue;
}
var adapter = adapters[descList[idx]];
Console.WriteLine("1: 釋放 IP (Release) 2: 續約 IP (Renew)");
Console.Write("請選擇操作:");
if (!int.TryParse(Console.ReadLine(), out int opt)) continue;
bool ok = opt == 1 ? DhcpController.Release(adapter) : DhcpController.Renew(adapter);
Console.WriteLine(ok ? "操作成功!" : "操作失敗,請確認權限或 DHCP 服務狀態。");
}
}
}
}
System.Management.dll 參考。ManagementScope 指向遠端電腦(`\\IP\root\cimv2`)並提供帳密,即可達成遠端 IP 管理。ReturnValue,0=成功、1=成功(需重啟)、其他為錯誤代碼。| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| 拋出 AccessDenied | 非管理員執行 / UAC 攔截 | 專案屬性加入 manifest `requireAdministrator` 或以管理員身分執行 |
| 找不到網卡 | 網卡未啟用 IP / 驅動異常 | 確認 `ipconfig /all` 有顯示 DHCP Enabled |
| ReturnValue = 87 | 參數錯誤或不支援該作業 | 確認網卡為 DHCP 模式,非靜態 IP |
透過 WMI 的 Win32_NetworkAdapterConfiguration,C# 可以輕鬆實現 DHCP 租約的釋放與續約,無論是本機管理還是遠端批次操作,都能以幾十行程式碼完成。掌握這項技能,能為自動化部署、網路診斷工具開發提供強大支援。