Изменения состояния шлюза VPN подключений

Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.
Отличная замена командной строке. Возможности просто безграничные.


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1503
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Изменения состояния шлюза VPN подключений

Сообщение UncleFather »

Задача:

На 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 #Завершаем выполнение сценария

Данный сценарий в архиве качаем отсюда:

ChangeVPNGate.rar
(3 КБ) 1679 скачиваний

Запускаем любым способом. Например, так:

Код: Выделить всё

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -WindowStyle Hidden C:\Soft\ChangeVPNGate.ps1

Скриншоты работы сценария:

При запуске сценария оболочка PowerShell может затребовать разрешение на изменение политики выполнения сценариев - нужно нажать «Да» («Y»)

10.jpg

В первом всплывающем окне сценарий запросит имя VPN подключения, состояние опции «Использовать основной шлюз в удаленной сети» которого нам нужно просмотреть или изменить. Вводит в окно запроса имя VPN подключения так, как оно отображается в системе:

11.jpg
11.jpg (21.82 КБ) 12054 просмотра

Теперь выводится текущее состояние опции и запрашивается подтверждение на изменение:

12.jpg

При согласии пользователя производится изменение состояния опции указанного VPN подключения, о чем выводится уведомление:

13.jpg

Если пользователь на каком-то шаге отказывается от изменений или превышает время ожидания 15 секунд, об этом выводится соответствующее сообщение и сценарий автоматически завершается:

14.jpg

Примечание:

Каждое из окон ожидает команды пользователя 15 секунд, затем происходит автоматический выход.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение