您可以使用 C# 更改 NIC 上的接口指标吗?
Can you change the Interface Metric on a NIC using C#?
可以通过进入 NIC 属性并选择 "Internet Protocol Version 4 (TCP/IPv4)" 属性然后单击 "Advanced" 来手动更改接口指标。
系统使用接口指标来确定使用哪个 NIC 的优先级。
无论如何,我正在编写一个测试,我需要在同一子网上的 NIC 之间来回切换,以便我可以控制我正在使用的外部设备上的连接。 (外部设备只有一个 IP 地址,但可以通过有线或 Wifi 访问)我需要测试这两个连接。
那么,如何通过 .net 在 C# 中以编程方式修改其中一个 NIC 上的接口指标?我看过 C++ 中的示例,但我正在寻找一种将 C# 与 .net 结合使用的方法。我正在尝试编写干净的代码而不将旧库推入其中。
我在 C# 中找到了一种非常简单的方法,使用 netsh.exe。
这仅在您 运行 您的程序作为管理员时有效。
命令行为:
netsh.exe interface ipv4 set interface "myNICsName" metric=20
要将指标设置为 'Automatic',只需将其设置为 0。
上限是9999,但如果你使用更高的东西,它只会为你设置为9999。
要以编程方式执行此操作,只需按以下方式使用 Process.Start:
System.Diagnostics.Process p = new System.Diagnostics.Process
{
StartInfo =
{
FileName = "netsh.exe",
Arguments = $"interface ipv4 set interface \"{nicName}\" metric={metric}",
UseShellExecute = false,
RedirectStandardOutput = true
}
};
bool started = p.Start();
if (started)
{
if (SpinWait.SpinUntil(() => p.HasExited, TimeSpan.FromSeconds(20)))
{
Log.Write($"Successfully set {nicName}'s metric to {metric}");
Log.Write($"Sleeping 2 seconds to allow metric change on {nicName} to take effect.");
Thread.Sleep(2000);
return true;
}
Log.Write($"Failed to set {nicName}'s metric to {metric}");
return false;
}
上面的代码还进行了一些错误检查以确保进程确实启动并进行了短暂的延迟,以便度量更改有机会生效。当我不包括延迟时,我发现我的代码有一些问题。
可以通过进入 NIC 属性并选择 "Internet Protocol Version 4 (TCP/IPv4)" 属性然后单击 "Advanced" 来手动更改接口指标。
系统使用接口指标来确定使用哪个 NIC 的优先级。
无论如何,我正在编写一个测试,我需要在同一子网上的 NIC 之间来回切换,以便我可以控制我正在使用的外部设备上的连接。 (外部设备只有一个 IP 地址,但可以通过有线或 Wifi 访问)我需要测试这两个连接。
那么,如何通过 .net 在 C# 中以编程方式修改其中一个 NIC 上的接口指标?我看过 C++ 中的示例,但我正在寻找一种将 C# 与 .net 结合使用的方法。我正在尝试编写干净的代码而不将旧库推入其中。
我在 C# 中找到了一种非常简单的方法,使用 netsh.exe。
这仅在您 运行 您的程序作为管理员时有效。
命令行为:
netsh.exe interface ipv4 set interface "myNICsName" metric=20
要将指标设置为 'Automatic',只需将其设置为 0。 上限是9999,但如果你使用更高的东西,它只会为你设置为9999。
要以编程方式执行此操作,只需按以下方式使用 Process.Start:
System.Diagnostics.Process p = new System.Diagnostics.Process
{
StartInfo =
{
FileName = "netsh.exe",
Arguments = $"interface ipv4 set interface \"{nicName}\" metric={metric}",
UseShellExecute = false,
RedirectStandardOutput = true
}
};
bool started = p.Start();
if (started)
{
if (SpinWait.SpinUntil(() => p.HasExited, TimeSpan.FromSeconds(20)))
{
Log.Write($"Successfully set {nicName}'s metric to {metric}");
Log.Write($"Sleeping 2 seconds to allow metric change on {nicName} to take effect.");
Thread.Sleep(2000);
return true;
}
Log.Write($"Failed to set {nicName}'s metric to {metric}");
return false;
}
上面的代码还进行了一些错误检查以确保进程确实启动并进行了短暂的延迟,以便度量更改有机会生效。当我不包括延迟时,我发现我的代码有一些问题。