Изменения состояния шлюза VPN подключений
Задача:
На MS Windows 10 существует проблема, когда для VPN подключений нельзя открыть свойства интернет-протоколов TCP любой версии. Но при этом существует необходимость в изменении дополнительного параметра «Использовать основной шлюз в удаленной сети».
Решение:
Это можно реализовать при помощи сценария PowerShell.
Данный сценарий отображает текущее состояние параметра «Использовать основной шлюз в удаленной сети» и позволяет его изменять для любого из присутствующих в системе VPN подключений.
Код хорошо прокомментирован и в дополнительных пояснениях не нуждается.
ChangeVPNGate.ps1
Код: Выделить всё
$WshShell = New-Object -ComObject wscript.shell #Создаем новый объект wscript.shell для того, чтобы выводить сообщения во всплывающее окно
$AllUsers = $false #Сбрасываем значение переменной $AllUsers, указывающей, что VPN подключения изначально будем просматривать в глобальном списке адресов
If (((Get-VpnConnection -AllUserConnection).Name | Select-Object -Last 1) -eq $null) { #Если в глобальном списке адресов нет VPN подключений
$FirstVPNName = (Get-VpnConnection).Name | Select-Object -Last 1 #то берем имя последнего VPN подключения из локального списка адресов
}
Else { #иначе
$FirstVPNName = (Get-VpnConnection -AllUserConnection).Name | Select-Object -Last 1 #берем имя последнего VPN подключения из глобального списка адресов
}
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null #Загружаем сборку из каталога приложения с использованием частичного имени 'Microsoft.VisualBasic' для вывода запроса во всплывающем окне
$VPNName = [Microsoft.VisualBasic.Interaction]::InputBox("Введите имя VPN подключения, для которого нужно изменить значение опции «Использовать основной шлюз в удаленной сети»", "Имя VPN подключения", $FirstVPNName) #Выводим во всплывающем окне запрос имени VPN подключения, которое необходимо изменить
If ($VPNName -eq "") { #Если имя сети пустое (в том числе, если была нажата кнопка "отмена"
$WshShell.popup("Подключение не указано. Программа закрывается.",15,"Пустая строка ввода.",0) | Out-Null #то во всплывающем окне выводим сообщение
Exit #Завершаем выполнение сценария
}
If (((Get-VpnConnection).Name | where {$_ -eq $VPNName}) -eq $null) { #Если в локальном списке адресов нет VPN подключения, имя которого точно совпадает с введенным в окно запроса
If (((Get-VpnConnection -AllUserConnection).Name | where {$_ -eq $VPNName}) -eq $null) { #то, если в глобальном списке адресов нет VPN подключения, имя которого точно совпадает с введенным в окно запроса
$WshShell.popup("Имя подключения $VPNName указано неверно. В системе нет таких VPN подключений. Программа закрывается.",15,"Неверное имя подключения.",0) | Out-Null #то во всплывающем окне выводим сообщение
Exit #Завершаем выполнение сценария
}
$AllUsers = $true #Здесь устанавливаем значение переменной $AllUsers в $true - в том случае, когда в глобальном списке адресов нашлось VPN подключение, имя которого точно совпадает с введенным в окно запроса
}
if ($AllUsers) { #Если VPN подключение из глобального списка адресов
if ((Get-VpnConnection -AllUserConnection -Name $VPNName).SplitTunneling) {$Body="НЕ установлена."} else {$Body="установлена."} #то, в зависимости от текущего состояния опции «Использовать основной шлюз в удаленной сети» глобального VPN подключения, присваиваем переменной $Body соответствующее значение
}
else { #иначе
if ((Get-VpnConnection -Name $VPNName).SplitTunneling) {$Body="НЕ установлена."} else {$Body="установлена."} #в зависимости от текущего состояния опции «Использовать основной шлюз в удаленной сети» локального VPN подключения, присваиваем переменной $Body соответствующее значение
}
$PopUp = $WshShell.popup("Опция «Использовать основной шлюз в удаленной сети» для подключения $VPNName $Body Вы хотите изменить состояние опции?",15,"Изменить текущее сотояние:",4) #Выводим всплывающее сообщение с текущим состоянием VPN подключения и запрашиваем у пользователя разрешение на изменение
If ($PopUp -eq 6) { #Если пользователь соглашается
If ($Body -eq "НЕ установлена.") { #то, если опция не установлена
if ($AllUsers) { #то, если VPN подключение из глобального списка адресов
Set-VpnConnection -AllUserConnection -Name $VPNName -SplitTunneling 0 #включаем опцию «Использовать основной шлюз в удаленной сети» глобального VPN подключения
}
Else { #иначе (если VPN подключение из локального списка адресов)
Set-VpnConnection -Name $VPNName -SplitTunneling 0 #включаем опцию «Использовать основной шлюз в удаленной сети» локального VPN подключения
}
}
Else { #иначе (если опция установлена)
if ($AllUsers) { #то, если VPN подключение из глобального списка адресов
Set-VpnConnection -AllUserConnection -Name $VPNName -SplitTunneling 1 #отключаем опцию «Использовать основной шлюз в удаленной сети» глобального VPN подключения
}
Else { #иначе (если VPN подключение из локального списка адресов)
Set-VpnConnection -Name $VPNName -SplitTunneling 1 #отключаем опцию «Использовать основной шлюз в удаленной сети» локального VPN подключения
}
}
if ($AllUsers) { #если VPN подключение из глобального списка адресов
if ((Get-VpnConnection -AllUserConnection -Name $VPNName).SplitTunneling) { #то, если опция «Использовать основной шлюз в удаленной сети» глобального VPN подключения отключена
$Body="ОТКЛЮЧЕНА." #то присваиваем переменной $Body соответствующее значение
}
else { #иначе (если опция «Использовать основной шлюз в удаленной сети» глобального VPN подключения вкключена)
$Body="ВКЛЮЧЕНА." #присваиваем переменной $Body соответствующее значение
}
}
Else { #иначе (если VPN подключение из локального списка адресов)
if ((Get-VpnConnection -Name $VPNName).SplitTunneling) { #то, если опция «Использовать основной шлюз в удаленной сети» локального VPN подключения отключена
$Body="ОТКЛЮЧЕНА." #то присваиваем переменной $Body соответствующее значение
}
else {
$Body="ВКЛЮЧЕНА." #присваиваем переменной $Body соответствующее значение
}
}
$WshShell.popup("Опция «Использовать основной шлюз в удаленной сети» для подключения $VPNName теперь $Body",15,"Текущее сотояние:",0) | Out-Null #во всплывающем окне выводим текущее состояние выбранного VPN подключения
}
Elseif ($PopUp -eq -1) { #иначе, если пользователь не успевает сделать выбор за 15 секунд
$WshShell.popup("Превышено время ожидания. Настройки подключения $VPNName не изменены. Программа закрывается.",15,"Превышено время ожидания.",0) | Out-Null #то во всплывающем окне выводим сообщение о превышении времени ожидания
}
Else{ #иначе, если пользователь отказывается от внесения изменений в настройки VPN подключения
$WshShell.popup("Настройки подключения $VPNName не изменены. Программа закрывается.",15,"Отказ от изменений.",0) | Out-Null #то во всплывающем окне выводим сообщение об отказе от изменений
}
Exit #Завершаем выполнение сценария
Данный сценарий в архиве качаем отсюда:
Запускаем любым способом. Например, так:
Код: Выделить всё
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -WindowStyle Hidden C:\Soft\ChangeVPNGate.ps1
Скриншоты работы сценария:
При запуске сценария оболочка PowerShell может затребовать разрешение на изменение политики выполнения сценариев - нужно нажать «Да» («Y»)
В первом всплывающем окне сценарий запросит имя VPN подключения, состояние опции «Использовать основной шлюз в удаленной сети» которого нам нужно просмотреть или изменить. Вводит в окно запроса имя VPN подключения так, как оно отображается в системе:
Теперь выводится текущее состояние опции и запрашивается подтверждение на изменение:
При согласии пользователя производится изменение состояния опции указанного VPN подключения, о чем выводится уведомление:
Если пользователь на каком-то шаге отказывается от изменений или превышает время ожидания 15 секунд, об этом выводится соответствующее сообщение и сценарий автоматически завершается:
Примечание:
Каждое из окон ожидает команды пользователя 15 секунд, затем происходит автоматический выход.