首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 透過 WMI 實現動態 IP 釋放與續約完整教學

     編輯:關於C#

背景與挑戰

在 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 服務狀態。");
            }
        }
    }
}

關鍵實作細節

  1. 參考組件:專案需加入 System.Management.dll 參考。
  2. 權限需求:執行程式需具備系統管理員權限,否則 WMI 呼叫會拒絕存取。
  3. 遠端控制:將 ManagementScope 指向遠端電腦(`\\IP\root\cimv2`)並提供帳密,即可達成遠端 IP 管理。
  4. 回傳值判讀:WMI 方法回傳 ReturnValue,0=成功、1=成功(需重啟)、其他為錯誤代碼。

常見問題排查

現象可能原因解決方向
拋出 AccessDenied非管理員執行 / UAC 攔截專案屬性加入 manifest `requireAdministrator` 或以管理員身分執行
找不到網卡網卡未啟用 IP / 驅動異常確認 `ipconfig /all` 有顯示 DHCP Enabled
ReturnValue = 87參數錯誤或不支援該作業確認網卡為 DHCP 模式,非靜態 IP

進階應用建議

  • 封裝為 Windows Service 定時檢查 IP 狀態並自動續約。
  • 結合 `ManagementEventWatcher` 監聽 `IPEnabled` 變更事件,即時反應網路異動。
  • 搭配 `Win32_NetworkAdapter` 啟用/停用網卡裝置,達成完整網路控制腳本。

總結

透過 WMI 的 Win32_NetworkAdapterConfiguration,C# 可以輕鬆實現 DHCP 租約的釋放與續約,無論是本機管理還是遠端批次操作,都能以幾十行程式碼完成。掌握這項技能,能為自動化部署、網路診斷工具開發提供強大支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved