C# 网络适配器信息获取与配置操作详解
在网络应用开发中,动态获取和修改本机网络配置往往是必要的功能需求。本文提供了一套完整的 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# 网络编程与系统管理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









