C# 网络适配器信息获取与配置操作详解

咖啡半糖
咖啡半糖
发布时间:2026-10-13 | 3人浏览过
原创

在网络应用开发中,动态获取和修改本机网络配置往往是必要的功能需求。本文提供了一套完整的 C# 辅助方案,涵盖从网络信息的只读检查(如 IP、网关、DNS、MAC)到利用 WMI 接口进行静态配置(IP、掩码、网关、DNS)以及切换 DHCP 模式的全流程实现。

网络适配器信息读取

为了方便地在项目中调用,首先定义一个包含各类网络属性的辅助类。该类封装了获取 IPv4 地址、默认网关、DHCP 服务器、MAC 地址以及主备 DNS 的逻辑。在实际使用中,核心思路是从 NetworkInterface 对象或底层数据集合中提取对应索引的信息。

第 1 步:实现基础属性获取

目的是将散乱的数组索引转换为易用的属性。注意,对于可能有多个 IP 的场景,通常按优先级取第一个有效 IPv4 地址作为主 IP。例如,在获取 IP 地址时,需判空处理;在获取网关时,若存在多个网关且首个为 0.0.0.0,则视为无默认网关。

public class NetworkAdapterUtil
{
    // ... 内部私有字段略

    /// <summary>
    /// 获取当前网卡的主 IP 地址
    /// </summary>
    public string IpAddress
    {
        get
        {
            string ipAddress;
            var address = GetAddress();
            if (address == null)
            {
                ipAddress = string.Empty;
            }
            else
            {
                ipAddress = address.Address.ToString();
            }
            return ipAddress;
        }
        set { if (value == null) throw new ArgumentNullException(nameof(value)); }
    }

    /// <summary>
    /// 获取默认网关地址
    /// </summary>
    public string Gateway
    {
        get
        {
            string gateway;
            if (GatewayList != null && GatewayList.Count > 0)
            {
                // 过滤掉无效的 0.0.0.0 地址
                gateway = GatewayList[0].Address.ToString() == "0.0.0.0" ? "" : GatewayList[0].Address.ToString();
            }
            else
            {
                gateway = string.Empty;
            }
            return gateway;
        }
        set { if (value == null) throw new ArgumentNullException(nameof(value)); }
    }

    /// <summary>
    /// 获取 MAC 地址(格式化输出)
    /// </summary>
    public string MacAddressFormatted
    {
        get
        {
            string macAddress;
            if (MacAddress == null)
                macAddress = string.Empty;
            else if (MacAddress.ToString().Length == 12)
            {
                // 插入连字符格式化,例如 00-1A-2B-3C-4D-5E
                macAddress = MacAddress.ToString().Insert(4, "-").Insert(9, "-");
            }
            else
            {
                macAddress = MacAddress.ToString();
            }
            return macAddress;
        }
        set { if (value == null) throw new ArgumentNullException(nameof(value)); }
    }
}

第 2 步:完善 DNS 与掩码查询

DNS 分为主用和备用,需通过索引判断是否存在。子网掩码需注意某些非标准接口可能返回 null,此时可设定默认值。

// 主 DNS 地址
public string DnsMain
{
    get
    {
        var dnsMain = string.Empty;
        if (DnsAddresses != null && DnsAddresses.Count > 0)
        {
            if (IsIPAddress(DnsAddresses[0].ToString()))
            {
                dnsMain = DnsAddresses[0].ToString();
            }
        }
        return dnsMain;
    }
    set { if (value == null) throw new ArgumentNullException(nameof(value)); }
}

// 子网掩码
public string Mask
{
    get
    {
        string mask;
        var address = GetAddress();
        if (address == null)
        {
            mask = "";
        }
        else
        {
            if (address.IPv4Mask != null)
            {
                mask = address.IPv4Mask.ToString();
            }
            else
            {
                // 回退默认值,视具体业务场景而定
                mask = "255.255.255.0";
            }
        }
        return mask;
    }
    set { if (value == null) throw new ArgumentNullException(nameof(value)); }
}

WMI 配置网络参数

当需要修改系统的 TCP/IP 设置时,最可靠的方式是通过 Windows Management Instrumentation (WMI) 调用 Win32_NetworkAdapterConfiguration 类。以下方法展示了如何通过 WMI 接口完成静态 IP 分配及相关参数的设置。

第 3 步:构建参数校验与前置检查

在执行任何写入操作前,必须校验输入字符串是否符合 IPv4 规范,防止无效配置导致网络不可达。正则表达式是校验 IP 格式的轻量级方案。

/// <summary>
/// 验证单个 IP 地址字符串是否合法
/// </summary>
private bool IsIPAddress(string ipAddress)
{
    const string regexStr = @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$";
    var regex = System.Text.RegularExpressions.Regex.Match(ipAddress, regexStr);
    return regex.Success;
}

/// <summary>
/// 批量校验所有网络参数,若非法则返回错误描述
/// </summary>
public string CheckNetworkParams(string ipAddress, string subMask, string getWay, string dnsMain, string dnsBackup)
{
    if (!string.IsNullOrEmpty(ipAddress))
        if (!IsIPAddress(ipAddress)) return "IP 地址格式不对";
    if (!string.IsNullOrEmpty(subMask))
        if (!IsIPAddress(subMask)) return "子网掩码格式不对";
    if (!string.IsNullOrEmpty(getWay))
        if (!IsIPAddress(getWay)) return "网关地址格式不对";
    if (!string.IsNullOrEmpty(dnsMain))
        if (!IsIPAddress(dnsMain)) return "主 DNS 地址格式不对";
    if (string.IsNullOrEmpty(dnsBackup)) return "";
    return !IsIPAddress(dnsBackup) ? "备用 DNS 地址格式不对" : "";
}

第 4 步:执行 IP、掩码、网关及 DNS 的静默配置

使用 ManagementClass 枚举所有已启用 IP 的网络适配器,定位目标设备后,依次调用 WMI 方法。返回值 0 表示成功,1 通常表示需要重启生效,其他值为失败。

/// <summary>
/// 核心配置方法:调用 WMI 接口更新 TCP/IP 设置
/// </summary>
private bool SetIpAddress(IPAddress[] ip, IPAddress[] submask, string[] gateways, string[] dns)
{
    try
    {
        var wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
        var moc = wmi.GetInstances();
        foreach (var o in moc)
        {
            var mo = (ManagementObject)o;
            // 仅处理已启用 IP 的对象
            if (!(bool)mo["IPEnabled"])
                continue;

            // 匹配特定网卡 SettingID,实际项目中应通过网卡 ID 精确过滤
            if (NetworkInterfaceId != mo["SettingID"].ToString()) continue;

            // 1. 设置静态 IP 和子网掩码
            if (ip != null && submask != null)
            {
                ManagementBaseObject inPar = mo.GetMethodParameters("EnableStatic");
                inPar["IPAddress"] = ip;
                inPar["SubnetMask"] = submask;
                ManagementBaseObject outPar = mo.InvokeMethod("EnableStatic", inPar, null);
                int ret = Convert.ToInt32(outPar["returnValue"]);
                if (ret != 0 && ret != 1) return false;
            }

            // 2. 设置网关
            if (gateways != null)
            {
                inPar = mo.GetMethodParameters("SetGateways");
                inPar["DefaultIPGateway"] = gateways;
                outPar = mo.InvokeMethod("SetGateways", inPar, null);
                int ret = Convert.ToInt32(outPar["returnValue"]);
                if (ret != 0 && ret != 1) return false;
            }

            // 3. 设置 DNS
            if (dns != null)
            {
                inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
                inPar["DNSServerSearchOrder"] = dns;
                outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null);
                int ret = Convert.ToInt32(outPar["returnValue"]);
                if (ret != 0 && ret != 1) return false;
            }
        }
        return true;
    }
    catch
    {
        return false;
    }
}

高级配置:DHCP 与快捷封装

除了固定 IP,很多时候我们需要将网络恢复为自动获取状态。

第 5 步:启用/关闭 DHCP 服务

直接调用 WMI 对象的 EnableDHCP() 方法即可重置为自动获取 IP 和 DNS。该方法执行后无需额外参数传递。

/// <summary>
/// 将该网卡设置为 DHCP 自动获取模式
/// </summary>
public bool EnableDhcp()
{
    try
    {
        var wmi = new ManagementClass("Win32_NetworkAdapterConfiguration");
        var moc = wmi.GetInstances();
        foreach (var o in moc)
        {
            var mo = (ManagementObject)o;
            if (!(bool)mo["IPEnabled"]) continue;
            // 根据具体网卡 ID 定位
            if (mo["SettingID"].ToString() != NetworkInterfaceId) continue;

            // 关闭静态 DNS 并开启 DHCP
            mo.InvokeMethod("SetDNSServerSearchOrder", null);
            mo.InvokeMethod("EnableDHCP", null);
        }
        return true;
    }
    catch
    {
        return false;
    }
}

以上代码片段组合起来便构成了一个强大的 C# 网络管理工具类。它不仅能解决简单的信息查看需求,还能应对企业级应用中常见的网络环境快速切换问题。在实际部署或测试此类涉及系统底层的更改时,请确保应用程序具备相应的管理员权限。

以上就是 C# 网络适配器简单操作的详细内容,更多关于 C# 网络编程与系统管理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表