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

如何使用C#修改网卡(NIC)的Interface Metric?

用C#修改网卡Interface Metric的两种实现方式

我之前做过类似的多网卡切换需求,用来控制通过指定网卡访问单一IP的外部设备,下面分享两种在Windows系统下可行的C#实现方法,都需要以管理员权限运行程序才能生效:

方法一:使用WMI(Windows Management Instrumentation)

这种方法直接通过WMI操作网络配置,不需要依赖额外工具,需要引用System.Management程序集。

using System.Management;

public static void SetInterfaceMetric(string nicName, int newMetric)
{
    // 查询目标网卡的TCP/IPv4启用配置
    var query = new ObjectQuery($"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE Description LIKE '%{nicName}%' AND IPEnabled = TRUE");
    using var searcher = new ManagementObjectSearcher(query);
    using var collection = searcher.Get();

    foreach (ManagementObject config in collection)
    {
        // 获取当前的TCP/IP连接属性
        var properties = (ManagementBaseObject)config.InvokeMethod("GetIPConnectionMetric", null, null);
        // 修改Interface Metric值
        properties["InterfaceMetric"] = newMetric;
        // 保存修改到系统配置
        var result = (uint)config.InvokeMethod("SetIPConnectionMetric", new[] { properties }, null);
        
        if (result == 0)
        {
            Console.WriteLine($"成功将网卡 {nicName} 的Metric修改为 {newMetric}");
        }
        else
        {
            Console.WriteLine($"修改失败,错误代码: {result}");
        }
    }
}

配套:重启网卡生效

修改Metric后,建议重启网卡让系统刷新路由表,可添加这段辅助代码:

public static void RestartNetworkAdapter(string nicName)
{
    var query = new ObjectQuery($"SELECT * FROM Win32_NetworkAdapter WHERE Description LIKE '%{nicName}%' AND NetEnabled = TRUE");
    using var searcher = new ManagementObjectSearcher(query);
    foreach (ManagementObject adapter in searcher.Get())
    {
        adapter.InvokeMethod("Disable", null);
        System.Threading.Thread.Sleep(1000);
        adapter.InvokeMethod("Enable", null);
        Console.WriteLine($"已重启网卡 {nicName}");
    }
}

方法二:调用PowerShell命令

如果WMI遇到权限或兼容性问题,直接调用PowerShell的Set-NetIPInterface命令更直观,适合熟悉PowerShell的场景:

using System.Diagnostics;

public static void SetInterfaceMetricWithPowerShell(string nicName, int newMetric)
{
    var processStartInfo = new ProcessStartInfo
    {
        FileName = "powershell.exe",
        Arguments = $"Set-NetIPInterface -InterfaceAlias \"{nicName}\" -InterfaceMetric {newMetric}",
        Verb = "runas", // 触发管理员权限
        WindowStyle = ProcessWindowStyle.Hidden,
        CreateNoWindow = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false
    };

    using var process = Process.Start(processStartInfo);
    process.WaitForExit();

    var output = process.StandardOutput.ReadToEnd();
    var error = process.StandardError.ReadToEnd();

    if (process.ExitCode == 0)
    {
        Console.WriteLine($"Metric修改成功\n{output}");
    }
    else
    {
        Console.WriteLine($"修改失败\n错误信息: {error}");
    }
}

关键提示

Interface Metric是系统选择网卡优先级的核心参数——数值越小,网卡优先级越高。你可以通过调整不同网卡的Metric值,让系统优先使用指定网卡访问目标IP,完美匹配多网卡切换访问外部设备的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:20:38