C# 断开状态网络接口无法修改静态IP与DHCP配置问题咨询
问题描述
当设备连接WiFi时,代码可正常设置静态IP和DHCP,但未插网线时以太网本地网络接口的配置无法修改;反之当设备插网线使用有线网络时,WiFi接口的配置也无法修改。
该问题仅在目标网络接口处于断开状态、无活动连接时出现,传入的nicName参数是从窗体提交的接口名称,作用是匹配需要修改配置的目标接口。
设置静态IP核心代码
public static bool SetStaticIp( string nicName, Object objSite ) { Site site = (Site)objSite; //string nicName = adapter.Description; string ipAddress = $"{site.IP}"; string subnetMask = $"{site.SubnetMask}"; string gateway = $"{site.Gateway}"; string dns1 = $"{site.Dns1}"; string dns2 = $"{site.Dns2}"; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); string nicDesc = nicName; if (networkInterface != null) { nicDesc = networkInterface.Description; } foreach (ManagementObject mo in moc) { bool moIpEnable = (bool)mo["IPEnabled"]; string moDesc = (string)mo["Description"]; if (moDesc.Equals(nicName) == true) { try { ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic"); newIP["IPAddress"] = new string[] { ipAddress }; newIP["SubnetMask"] = new string[] { subnetMask }; ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null); if (gateway != null) { ManagementBaseObject newGateway = mo.GetMethodParameters("SetGateways"); newGateway["DefaultIPGateway"] = new string[] { gateway }; newGateway["GatewayCostMetric"] = new int[] { 1 }; ManagementBaseObject setGateway = mo.InvokeMethod("SetGateways", newGateway, null); } if (dns1 != null || dns2 != null) { ManagementBaseObject newDns = mo.GetMethodParameters("SetDNSServerSearchOrder"); var dns = new List<string>(); if (dns1 != null) { dns.Add(dns1); } if (dns2 != null) { dns.Add(dns2); } newDns["DNSServerSearchOrder"] = dns.ToArray(); ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDns, null); } } catch (Exception err) { Log(LOG_FN.ERROR, $"SetStaticIp({nicDesc}): Klarte ikke sette statisk IP. {err.Message}"); return false; } } } return true; }
设置DHCP核心代码
public static int SetDHCP(string nicName) { //string nicName = sroGlobal.SelectedAdapters.Description; //string nicName = Name; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); NetworkInterface networkInterface = interfaces.FirstOrDefault(x => x.Name == nicName); ManagementObjectCollection networkCollection = mc.GetInstances(); string nicDesc = nicName; if (networkInterface != null) { nicDesc = networkInterface.Description; } foreach (ManagementObject mo in networkCollection) { bool moIpEnable = (bool)mo["IPEnabled"]; string moDesc = (string)mo["Description"]; if (string.Compare(moDesc, nicName,StringComparison.InvariantCultureIgnoreCase) == 0) { try { ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder"); newDNS["DNSServerSearchOrder"] = null; ManagementBaseObject enableDHCP = mo.InvokeMethod("EnableDHCP", null, null); ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); return 1; } catch (Exception err) { Log(LOG_FN.ERROR, $"SetDHCP({nicDesc}): Could'nt set DHCP. {err.Message}"); return -1; } } } return 0; }
问题原因及解决方案
核心原因
你调用的Win32_NetworkAdapterConfiguration类的EnableStatic、EnableDHCP方法本身就限制了仅对已启用且处于连接状态的网卡生效,断开状态的网卡IPEnabled属性为false,直接调用WMI方法会静默失败,不会抛出异常也不会写入配置。
另外当前代码存在匹配逻辑缺陷:NetworkInterface.Name是网卡在系统中显示的友好名称(比如「以太网」「WLAN」),而Win32_NetworkAdapterConfiguration.Description是网卡硬件描述(比如「Realtek PCIe GbE Family Controller」),两者不是同一个值,部分场景下会出现匹配失败的问题。
修复方案
- 修正网卡匹配逻辑:改为匹配
NetworkInterface.Id和WMI对象的SettingID属性,匹配准确率更高。 - 适配断开状态网卡的配置需求:可以调用
netsh命令行工具实现离线配置,该工具支持对断开状态的网卡写入配置,不需要网卡处于连接状态,示例命令如下:- 设置静态IP:
netsh interface ip set address "以太网" static 192.168.1.100 255.255.255.0 192.168.1.1 - 设置静态DNS:
netsh interface ip set dnsservers "以太网" static 114.114.114.114 primary - 开启DHCP:
netsh interface ip set address "以太网" dhcp & netsh interface ip set dnsservers "以太网" dhcp
- 设置静态IP:
- 增加执行结果判断:
EnableStatic等WMI方法的返回值为0代表执行成功,返回非0值代表执行失败,需要增加对应的判断逻辑,不要默认执行成功。
内容的提问来源于stack exchange,提问作者Saetheer
相关产品推荐
相关产品推荐

