Je veux ajouter ma solution au mélange. Elle fonctionne sur un Shell UNIX alimenté par Cygwin sous Windows 7 ou plus récent, mais devrait également fonctionner avec MSYS2, Bash-on-Windows [WSL] après la construction 14986, ou Busybox pour Windows). Doit être exécuté avec des privilèges d'administrateur.
Il a quelques paramètres et essaie de détecter certaines des choses que vous n'avez pas explicitement définies. Il définit également le numéro d'interface (IF) de manière explicite pour contrer certains problèmes que certains utilisateurs (comme moi) ont rencontrés avec les autres solutions proposées ici.
#!/bin/sh
# these three settings are required
adapter_name='VPN Connection'
username=
password=
# This setting here might be important because it's about the target network
# and in some cases it can't be properly determined automatically so this might
# be then worth setting.
# Format is in CIDR notation with the network address and a forward slash and
# the amount of network bits
target_network=192.168.0.0/24
# the IP you will get on the target network, also the VPN gateway on your
# local machine, you normally don't need to set this as the script tries to
# detect it
ip=
# optional setting for metric which normally shouldn't be necessary,
# except in te very rare cases where it should be set to a value lower than all
# other routes that might match the target network
metric=
# experimental setting to delete routes to the target network prior and after
# should normally not be needed unless this script fails and you get error
# messages like 'The route addition failed: The object already exists.'
route_cleanup=F
prog_name=${0##*/}
msg() {
printf '%s: %s\n' "$prog_name" "$*"
}
die() {
msg "$*" >&2
exit 1
}
[ "$adapter_name" ] || die "Adapter name not set!"
[ "$username" ] || die "Username not set!"
[ "$password" ] || die "Password not set!"
if [ "$(uname -o)" != 'MS/Windows' ]; then
id -G | grep -qE '\<0|544\>' || die 'Not running with admin rights.'
fi
msg "Disconnecting any existing connection that might exist."
rasdial.exe "$adapter_name" /d
msg "Connecting"
rasdial.exe "$adapter_name" "$username" "$password"
if [ ! "$ip" ]; then
msg "Getting IP address on target network."
ip=$(netsh.exe interface ip show config name="$adapter_name" |
grep -a 'IP Address' | awk -F'[: ]+' '{print $4}')
[ "$ip" ] || die 'Could not get IP! Exiting.'
msg "Detected IP address as '$ip'."
fi
if [ ! "$target_network" ]; then
msg "Getting target network."
target_network=$(netsh.exe interface ip show config name="$adapter_name" |
grep -a 'Subnet Prefix' | awk -F'[: ]+' '{print $4}')
[ "$target_network" ] || die 'Could not get target network! Exiting.'
msg "Detected target network as '$target_network'."
fi
msg "Getting VPN interface number."
if=$(ROUTE.EXE print -4 | grep -a "$adapter_name" |
awk -F. '{gsub(" ", "");print $1}')
[ "$if" ] || die 'Could not get interface number! Exiting.'
msg "Detected VPN interface number as '$if'."
if [ "$route_cleanup" = T ]; then
msg "Deleting any potentially already existing routes for the target network."
ROUTE.EXE delete "$target_network"
fi
msg "Adding route for target network."
if [ "$metric" ]; then
ROUTE.EXE add "$target_network" "$ip" IF "$if" Metric "$metric"
else
ROUTE.EXE add "$target_network" "$ip" IF "$if"
fi
msg "VPN should be up now."
msg "Press enter to make it stop."
read -r _
if [ "$route_cleanup" = T ]; then
msg "Deleting route."
ROUTE.EXE delete "$target_network"
fi
msg "Disconnecting."
rasdial.exe "$adapter_name" /d
# msg "Press enter to exit."
# read -r _
exit 0
Il convient également de noter qu'il peut être nécessaire de définir manuellement une métrique faible, sinon la route par défaut correspondra avant le trafic destiné au VPN. Pour ce faire, il faut se rendre dans le paramètre de l'adaptateur où l'on ouvre le champ " Propriétés" pour l'adaptateur VPN "Mise en réseau" onglet "Protocole Internet version 4 (TCP/IP)" Propriétés "Avancé" et là, vous décochez l'option "Métrique automatique" (en plus de la case à cocher "Utiliser la passerelle par défaut " bien sûr) et définir la valeur dans le "Métrique de l'interface :" à une valeur inférieure à celle de l'itinéraire par défaut (cf. ROUTE.EXE -4 print
sortie).