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

C# 使用 WMI 程式化設定本機網路參數 (IP、DNS、閘道、子網路遮罩)

     編輯:ASP.NET 基礎

前言

在自動化部署、嵌入式裝置或無人值守安裝案例中,常需以程式碼調整網路卡的 IP 位址、子網路遮罩、預設閘道與 DNS 伺服器。.NET 透過 System.Management 命名空間存取 WMI Win32_NetworkAdapterConfiguration 類別,即可完成這些設定,且支援啟用/停用 DHCP。

核心類別:NetworkSetting

以下封裝常用操作的靜態方法,參數皆採用字串陣列以支援多 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();

權限需求與除錯提示

  • 管理員權限:修改網路設定需要提升權限,請參考「C# 讓應用程式預設以系統管理員身分執行」加入 UAC 提升。
  • 多網路卡:程式碼會遍歷所有 IPEnabled=true 的網路卡,若需針對特定網路卡,可依據 Description、MACAddress 或 SettingID 篩選。
  • 非同步執行:WMI 方法呼叫可能耗時數秒,建議放入背景執行緒或 Task.Run 避免阻塞 UI。
  • 驗證回傳值:InvokeMethod 回傳的 ManagementBaseObject 含 ReturnValue 屬性,0 代表成功,其他代碼請參考 MSDN Win32_NetworkAdapterConfiguration 文件。

總結

透過 WMI Win32_NetworkAdapterConfiguration,C# 可以完整掌控本機網路設定,適合自動化部署工具、網路診斷程式或 IoT 裝置設定介面。記得搭配管理員權限與例外處理,即可穩定運作於各種 Windows 環境。

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