UncleFather » 04 авг 2015 15:22, Вт
Задача:
На MS Windows 10 существует проблема, когда для VPN подключений нельзя открыть свойства интернет-протоколов TCP любой версии. Но при этом существует необходимость в изменении дополнительного параметра «Использовать основной шлюз в удаленной сети».
Решение:
Это можно реализовать при помощи сценария PowerShell.
Данный сценарий отображает текущее состояние параметра «Использовать основной шлюз в удаленной сети» и позволяет его изменять для любого из присутствующих в системе VPN подключений.
Код хорошо прокомментирован и в дополнительных пояснениях не нуждается.
Код: Выделить всё
$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 подключения так, как оно отображается в системе:
- 11.jpg (21.82 КБ) 12406 просмотров
Теперь выводится текущее состояние опции и запрашивается подтверждение на изменение:
При согласии пользователя производится изменение состояния опции указанного VPN подключения, о чем выводится уведомление:
Если пользователь на каком-то шаге отказывается от изменений или превышает время ожидания 15 секунд, об этом выводится соответствующее сообщение и сценарий автоматически завершается:
Примечание:
Каждое из окон ожидает команды пользователя 15 секунд, затем происходит автоматический выход.
[b][size=150]Задача:[/size][/b]
На MS Windows 10 существует [url=http://manaeff.ru/forum/viewtopic.php?p=1620#p1620]проблема[/url], когда для VPN подключений нельзя открыть свойства интернет-протоколов TCP любой версии. Но при этом существует необходимость в изменении дополнительного параметра «[b][i]Использовать основной шлюз в удаленной сети[/i][/b]».
[b][size=150]Решение:[/size][/b]
Это можно реализовать при помощи сценария [i]PowerShell[/i].
Данный сценарий отображает текущее состояние параметра «[b][i]Использовать основной шлюз в удаленной сети[/i][/b]» и позволяет его изменять для любого из присутствующих в системе VPN подключений.
Код хорошо прокомментирован и в дополнительных пояснениях не нуждается.
[spoiler title=ChangeVPNGate.ps1][code]$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 #Завершаем выполнение сценария[/code][/spoiler]
Данный сценарий в архиве качаем отсюда: [attachment=5]ChangeVPNGate.rar[/attachment]
Запускаем любым способом. Например, так:
[code]C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -WindowStyle Hidden C:\Soft\ChangeVPNGate.ps1[/code]
[b][size=130]Скриншоты работы сценария:[/size][/b]
При запуске сценария оболочка PowerShell может затребовать разрешение на изменение политики выполнения сценариев - нужно нажать «[b][i]Да[/i][/b]» («[b][i]Y[/i][/b]»)[attachment=4]10.jpg[/attachment]
В первом всплывающем окне сценарий запросит имя VPN подключения, состояние опции «[b][i]Использовать основной шлюз в удаленной сети[/i][/b]» которого нам нужно просмотреть или изменить. Вводит в окно запроса имя VPN подключения так, как оно отображается в системе:[attachment=3]11.jpg[/attachment]
Теперь выводится текущее состояние опции и запрашивается подтверждение на изменение:[attachment=2]12.jpg[/attachment]
При согласии пользователя производится изменение состояния опции указанного VPN подключения, о чем выводится уведомление:[attachment=1]13.jpg[/attachment]
Если пользователь на каком-то шаге отказывается от изменений или превышает время ожидания 15 секунд, об этом выводится соответствующее сообщение и сценарий автоматически завершается:[attachment=0]14.jpg[/attachment]
[b][size=130][color=#FF8000]Примечание: [/color][/size][/b]
Каждое из окон ожидает команды пользователя 15 секунд, затем происходит автоматический выход.