Автоматическое добавление маршрутов при включении VPN

Зачастую мне необходим какой-то "левый" маршрут куда-то.
Как правило, всё это добавляется каким-нибудь скриптом или делается руками.
А уж в UNIX/Linux и того проще - настроил и забыл.
Всё бы ничего, да вот только ноут у меня, в отличии от нетбука, бегает под Windows 8 =)
Отличная ОС, радует до чёртиков, но вот беда - выпилили там основательно CMD из цикла жизнедеятельности.
Но где наша не пропадала...
Нынче моден у мелкомягких PowerShell.
Я и ранее с ним сталкивался, но не то что бы сильно.
Отличная штука!
Особенно для тех, кто уже умеет программировать на Perl. Или на C#? Или на PHP...
Судя по всему, ребята ухнули и сделали реально классную вещь.
Мне, как ярому стороннику религиозно праведных языков (Perl!), совершенно легко дался и синтаксис, и общий принцип написания сценариев.
За бортом, конечно, много чего осталось (командлеты и прочее), но для одной из моей сторон разносторонне ограниченной личности не имеющей границ, этого пока что достаточно.
Итак.
Задача:
 - есть VPN;
 - нужны дополнительные маршруты тогда, когда мы подключаемся к VPN.

После некоторого времени, потраченного на поиск решения, я нашел сие.
Но сей скрипт мне не очень подходит, т.к. мне нужно несколько маршрутов с разными масками.
Лёгким мановением руки и двум чашкам чая родилось вот это:


# ---------------------------------------------------------------------------------------
# Initial version: http://www.webboise.com/windows-powershell-script-for-adding-ip-routes-across-a-vpn/
# by Chris @ 30.9.2008
# ---------------------------------------------------------------------------------------
# Modified version: http://simpleverse.wordpress.com/2010/10/06/add-routes-on-vpn-connect-with-powershell-and-task-scheduler
# by Luka Ferlež @ 6.10.2010
# ---------------------------------------------------------------------------------------
# Modified version: http://arviol.ru/
# by Nadz Goldman aka Ilya Vasilyev @ 07.05.2013

# Если у вас вдруг не запускается скрипт со ссылкой на секурность, то читать здесь:
# http://technet.microsoft.com/library/hh847748.aspx
#
# Ну или вот чего прописать.
# Set-ExecutionPolicy Unrestricted -Scope CurrentUser
# Хотя лучше сертификат сгенерировать
#
# У меня здесь два варианта:
# Первый, которые ниже закомментирован, это двумерный массив.
# В конце для его работы тоже есть закомментированная строчка
#
# $aIP = New-Object "object[,]" 3,2
# 3 - Количество наших строк ( сколько адресов с масками у нас будет)
# 2 - Количество столбцов ( адрес + маска )
# $aIP[0,0] = "10.100.250.145"
# $aIP[0,1] = "255.255.255.128"
# $aIP[1,0] = "213.142.213.106"
# $aIP[1,1] = "255.255.255.255"
#
# Здесь два массива
# Первый - это адреса
# Второй - это маски
# И тот, и другой должны быть одинаковы по длине (кол-ву элементов)
$addresses = @( "10.10.250.0" , "10.100.20.0" , "213.142.216.245" )
$netmasks = @( "255.255.255.0" , "255.255.255.0" , "255.255.255.255" )
# С какой сети нам адрес будет выдан при подключении к VPN
$myVPNNetwork = "10.0.5."

if( $addresses.Count -ne $netmasks.Count ){
"Count of ip addresses is not equivalent count of masks!"
break
}
$myVPNAddress = ipconfig | findstr $myVPNNetworkif( !$myVPNAddress ) {
"You do not have an IP address on the VPN (VPN not connected?)"
exit
}
$myVPNAddress = $myVPNAddress.Trim()
$myVPNAddress = $myVPNAddress.Split(" ")
$bit = $myVPNAddress.Length - 1
$myVPNAddress = $myVPNAddress[$bit]
foreach( $address in $addresses ){
$hasRoute = route print | findstr $address
if( $hasRoute ){
"Deleting route " + $address
route delete $address
}
}
for( $aLength = 0 ; $aLength -lt $addresses.Count ; $aLength++ ){
"Adding route " + $addresses.Item( $aLength ) + " mask: " + $netmasks.Item( $aLength )
route add $addresses.Item( $aLength ) MASK $netmasks.Item( $aLength ) $myVPNAddress
}

# Для варианта с двумерным массивом
# for( $n = 0 ; $n -lt 2 ; $n++ ){ route add $b[0,$n] $b[1,$n] }
 


Что бы сие автоматом запускалось, нужно вот чего в консоли прописать: 

  schtasks /create /F /TN "VPN Connection Update" /TR "Powershell.exe -NonInteractive -command C:\vpn-routes.ps1" /SC ONEVENT /EC Application /MO " *[System[(Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='VPN NAME']]"  

Где:
  C:\vpn-routes.ps1 - указание местонахождения нашего скрипта,
  VPN NAME - название нашего VPN-соединения.
  Как видите, всё просто и без вкуса.
  Хорошего настроения!
 

 arviol.ru, 2006

Докер -- Сильно. Выгодно. Надежно