如何使用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
相关产品推荐
相关产品推荐

