You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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」),两者不是同一个值,部分场景下会出现匹配失败的问题。

修复方案

  1. 修正网卡匹配逻辑:改为匹配NetworkInterface.Id和WMI对象的SettingID属性,匹配准确率更高。
  2. 适配断开状态网卡的配置需求:可以调用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
  3. 增加执行结果判断:EnableStatic等WMI方法的返回值为0代表执行成功,返回非0值代表执行失败,需要增加对应的判断逻辑,不要默认执行成功。

内容的提问来源于stack exchange,提问作者Saetheer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 03:45:03