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

C# 使用 WMI 修改網路卡 IP 位址、閘道與 DNS 完整實作

     編輯:關於C#

前言

在開發系統管理工具或網路設定小程式時,常需要以程式碼動態變更網路介面卡的 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();

注意事項

  • 程式需以系統管理員權限執行,否則 WMI 呼叫會拋出「存取被拒」例外。
  • 若電腦有多張網卡,Win32_NetworkAdapterConfiguration 會全部套用;實務上建依據 Description 或 MACAddress 先行篩選目標網卡。
  • DNS 伺服器陣列順序即為解析優先順序。

總結

透過 WMI 的 Win32_NetworkAdapterConfiguration 類別,我們能以純 C# 程式碼完整掌控網路卡的 IP 設定,適用於自動化部署、網路切換工具或嵌入式裝置的網路配置功能。

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