如何通过C#在Windows系统中直接修改网络适配器的DNS IP地址
C#修改Windows系统DNS地址的正确实现
问题排查
原有代码未生效主要有以下几个核心原因:
- 权限不足:修改系统网络配置属于特权操作,必须以管理员身份运行程序才会生效,非管理员身份下WMI调用会无报错但实际执行失败
- 网卡匹配规则不准确:通过
Caption包含网卡描述的匹配方式稳定性差,容易匹配到错误的网卡对象 - 未校验执行结果:
SetDNSServerSearchOrder方法调用有返回值,未校验无法确认是否执行成功
优化后代码
using System.Management; using System.Net.NetworkInformation; /// <summary> /// 设置指定网络适配器的DNS服务器地址 /// 仅支持Windows系统,需要管理员权限 /// </summary> /// <param name="ni">要修改的网络适配器对象</param> /// <param name="dnsAddresses">DNS地址数组,传null则设为自动获取DNS</param> /// <returns>执行结果状态码,0为成功</returns> public static uint SetDNS(this NetworkInterface ni, string[] dnsAddresses) { if (ni == null) return 0; using ManagementClass managementClass = new ManagementClass("Win32_NetworkAdapterConfiguration"); using ManagementObjectCollection instances = managementClass.GetInstances(); foreach (ManagementObject instance in instances) { // 仅匹配IP启用、且SettingID和网卡ID完全一致的对象(SettingID是网卡的唯一GUID标识) if (!(bool)instance["IPEnabled"] || instance["SettingID"].ToString() != ni.Id) { instance.Dispose(); continue; } using ManagementBaseObject parameters = instance.GetMethodParameters("SetDNSServerSearchOrder"); parameters["DNSServerSearchOrder"] = dnsAddresses?.Length == 0 ? null : dnsAddresses; using ManagementBaseObject result = instance.InvokeMethod("SetDNSServerSearchOrder", parameters, null); return (uint)result["ReturnValue"]; } return 999; // 未找到匹配的网卡 }
必做配置
- 项目右键 -> 添加 -> 引用 -> 程序集 -> 勾选
System.Management并保存 - 强制程序以管理员身份运行:项目新增应用程序清单文件(app.manifest),修改配置项为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- 常见返回码说明:
- 0:执行成功
- 5:权限不足,未以管理员身份运行
- 70:传入的DNS地址格式无效
- 84:配置的IP地址和子网掩码不匹配
修改完成后等待数秒再执行ipconfig /all即可看到修改后的DNS配置,无需调用cmd.exe进程。
内容的提问来源于stack exchange,提问作者TRex
相关产品推荐
相关产品推荐

