3 votes

Powershell: Comment déterminer l'adapterIndex de l'interface vers le public?

J'utilise un script PowerShell pour définir manuellement mon DNS.

Cela fonctionne bien, mais lorsque je passe d'un wifi à deux stations d'accueil différentes, le "ifIndex" de get-NetAdapter change.

Filtrer uniquement pour "Up" ne fonctionne pas, car il y a plusieurs interfaces Up (voir ci-dessous)

Je pense que je dois détecter l'interface qui est à la fois "Up" et est la route vers le public (par exemple, sur la route vers google.com ou quelque chose de public).

Comment faire cela?

PS C:\Users\joe> get-netadapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet                  TAP-ProtonVPN Windows Adapter V9             32 Déconnecté 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 Déconnecté 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

5voto

Vous pouvez utiliser get-netroute pour obtenir le numéro d'index de l'adaptateur avec la valeur 0 ou false qui est la métrique la plus basse et donc l'adaptateur qui devrait être le défaut pour le trafic à utiliser.

PowerShell

Get-NetRoute | % { Process { If (!$_.RouteMetric) { $_.ifIndex } } };
Set-DNSClientServerAddress –interfaceIndex $intix –ServerAddresses ("127.0.0.1","1.1.1.2");

Exemple de sortie

Commande: 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 : Connexion au réseau local* 12
InterfaceIndex : 14
RouteMetric    : 256

InterfaceAlias : Connexion au réseau local* 11
InterfaceIndex : 27
RouteMetric    : 256

Ressources complémentaires

4voto

swbbl Points 241

@Drink More Pimp Juice IT a déjà mentionné une solution simple, qui fonctionne s'il y a un seul adaptateur réseau avec une passerelle par défaut activée et active.

Si vous avez plusieurs adaptateurs réseau activés et actifs en même temps, ce qui se produit lorsque vous utilisez un ordinateur portable qui ne désactive pas ou ne déconnecte pas l'adaptateur WiFi lorsqu'il est connecté via Ethernet, vous aurez deux routes avec une métrique de route de 0, mais avec des InterfaceMetric différents.

Lorsque les routes sont configurées manuellement, il est également possible que la métrique de route de la route par défaut ne soit pas du tout 0.

Solution

Si vous voulez obtenir la route par défaut globale du système d'exploitation dans de tels cas, vous devez prendre la somme de RouteMetric et InterfaceMetric et utiliser les routes par défaut pour IPv4 et IPv6 comme filtre de destination.

La commande suivante obtient la route par défaut de votre système d'exploitation en utilisant les routes par défaut IPv4 et IPv6.

Get-NetRoute -DestinationPrefix '0.0.0.0/0', '::/0' |
    Sort-Object -Property { $_.InterfaceMetric + $_.RouteMetric } |
    Select-Object -First 1

Vous pouvez supprimer le préfixe de destination IPv6 '::/0' si vous voulez uniquement déterminer la route IPv4.

Avec l'Index d'Interface ifIndex retourné, vous pouvez changer l'adaptateur réseau respectif. Il est également possible de rediriger la sortie ci-dessus directement vers Get-NetAdapter ou tout autre cmdlet qui accepte l'Index d'Interface en tant que propriété nommée.

PowerShell 6+

A partir de PowerShell 6, nous pouvons simplifier la commande, car il y a le nouveau paramètre Top disponible pour Sort-Object.

Get-NetRoute -DestinationPrefix '0.0.0.0/0', '::/0' |
    Sort-Object -Property { $_.InterfaceMetric + $_.RouteMetric } -Top 1 

Ressources informatives

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X