我使用 powershell 脚本来手动设置我的 DNS。
这很有效,但是当我在 wifi 和两个不同的扩展坞之间移动时,get-NetAdapter 中的“ifIndex”会发生变化。
仅过滤“Up”是行不通的,因为有多个 Up 接口(见下文)
我想我需要检测既处于启动状态又为通向公共路线的接口(例如,在通向 google.com 或某个公共网站的路线上)。
这个怎么做?
PS C:\Users\joe> get-netadapter
Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
---- -------------------- ------- ------ ---------- ---------
Ethernet TAP-ProtonVPN Windows Adapter V9 32 Disconnected 00-FF-F9-EE-DD-E4 1 Gbps
VMware Network Adapte...1 VMware Virtual Ethernet Adapter for ... 30 Up 00-50-56-EE-DD-01 100 Mbps
Wi-Fi Dell Wireless 1820A 802.11ac 25 Up C8-FF-28-EE-DD-4D 702 Mbps
VMware Network Adapte...8 VMware Virtual Ethernet Adapter for ... 24 Up 00-50-56-EE-DD-08 100 Mbps
Bluetooth Network Conn... Bluetooth Device (Personal Area Netw... 15 Disconnected C8-FF-28-EE-DD-4E 3 Mbps
vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 22 Up 00-15-5D-EE-DD-F0 10 Gbps
vEthernet (WSL) Hyper-V Virtual Ethernet Adapter #2 38 Up 00-15-5D-EE-DD-00 10 Gbps
答案1
@多喝点皮条客果汁 IT已经提到了一个简单的解决方案,如果only one network adapter
启用并激活默认网关,该解决方案就可以工作。
如果您同时启用并激活了多个网络适配器(当您使用笔记本电脑通过以太网连接时不会禁用或断开 WiFi 适配器时就会发生这种情况),那么您将拥有两条路由,其路由度量为0
,但 InterfaceMetric 不同。
当手动配置路由时,默认路由的路由度量也可能0
根本不存在。
解决方案
RouteMetric
在这种情况下,如果您想获取操作系统的全局默认路由,则必须将和相加,InterfaceMetric
并使用 IPv4 和 IPv6 的默认路由作为目标过滤器。
以下命令使用 IPv4 和 IPv6 默认路由获取操作系统的默认路由。
Get-NetRoute -DestinationPrefix '0.0.0.0/0', '::/0' |
Sort-Object -Property { $_.InterfaceMetric + $_.RouteMetric } |
Select-Object -First 1
'::/0'
如果只想确定 IPv4 路由,可以删除 IPv6 目标前缀。
使用返回的接口索引,ifIndex
您可以更改相应的网络适配器。也可以将上面的输出直接传输到Get-NetAdapter
或任何其他接受 InterfaceIndex 作为命名属性的 cmdlet。
PowerShell 6+
从 PowerShell 6 开始,我们可以简化命令,因为有了新的Top
参数Sort-Object
。
Get-NetRoute -DestinationPrefix '0.0.0.0/0', '::/0' |
Sort-Object -Property { $_.InterfaceMetric + $_.RouteMetric } -Top 1
信息资源
-
当选择了网络流量路由并且配置了 Set-NetIPInterface 命令的 InterfaceMetric 参数时, 用于确定接口优先级的总体度量是路由度量和接口度量的总和。通常,接口度量会优先考虑某个特定接口,例如如果有线和无线都可用,则使用有线。
IPv4 路由的自动度量功能说明
https://docs.microsoft.com/en-us/troubleshoot/windows-server/networking/automatic-metric-for-ipv4-routes
答案2
您可以使用获取网络路由获取具有0
或false
值的适配器索引号,该值是最低度量,因此该适配器应是流量使用的默认适配器。
电源外壳
Get-NetRoute | ForEach-Object { Process { If (!$_.RouteMetric) { $_.ifIndex } } };
Set-DNSClientServerAddress –interfaceIndex $intix –ServerAddresses ("127.0.0.1","1.1.1.2");
输出示例
命令: Get-NetRoute | Select InterfaceAlias, InterfaceIndex, RouteMetric | FL
InterfaceAlias : Loopback Pseudo-Interface 1
InterfaceIndex : 1
RouteMetric : 256
InterfaceAlias : Wi-Fi 3
InterfaceIndex : 7
RouteMetric : 0
InterfaceAlias : Local Area Connection* 12
InterfaceIndex : 14
RouteMetric : 256
InterfaceAlias : Local Area Connection* 11
InterfaceIndex : 27
RouteMetric : 256
支持资源
- 获取NetRoute
- 设置 DNS 客户端服务器地址
- ForEach 对象
标准别名对于 Foreach 对象:'
%
' 符号,ForEach - 如果()