【问题标题】:How to automate VPN connection on Windows 10如何在 Windows 10 上自动化 VPN 连接
【发布时间】:2017-07-20 03:16:45
【问题描述】:

我下个月要去旅行,我想自动化 VPN 连接过程,以便在发生 X 事件时,脚本会触发并自动连接我。我已经在ms-settings:network-vpn 中配置了 [L2TP/IPSec] VPN 连接并验证它可以正常工作,但事实证明它是自动化步骤存在问题。

Windows GUI:凭据已保存。

PowerShellRememberCredential 属性设置为 True

VBScript: 奇怪的是,VPN 连接是隐藏的:

Dim oShell : Set oShell = CreateObject("Shell.Application")
Dim NetConn : Set NetConn = oShell.Namespace(49)
Dim Connections : Set Connections = NetConn.Items
wscript.echo "Connection Count [" & Connections.Count & "]"
For i = 0 to Connections.Count - 1
    wscript.echo "Connections.Item(" & i & ").Name: [" & Connections.Item(i).Name & "]"
next

rasdial <entry>:预期返回错误 691。

rasphone -d <entry>:显示“连接”对话框,而我希望它自动连接并隐藏。

这在 Windows 10 中是否可行?还是我只是忽略了一些小而关键的细节?

【问题讨论】:

  • 为什么隐藏?
  • 你的猜测和我的一样好。我在控制面板\网络和 Internet\网络连接 (::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}) 中有 9 个对象:但在 VBScript 中,它返回除 VPN 连接之外的所有内容。
  • 是SSTP连接吗?
  • 它不是 SSTP,它是 L2TP/IPSec。我想知道是否适用相同的规则。

标签: powershell batch-file vbscript automation windows-10


【解决方案1】:

我最终利用Add-VpnConnectionTriggerApplication 在启动特定可执行文件/UWP 应用程序时触发 VPN 的自动连接。缺点是这样做时,PoSh 会警告必须启用 SplitTunneling,这不太理想。

但是在玩了一段时间(现在只有 2 个小时左右)以确保 VPN 密钥关闭特定的可执行文件/UWP 之后,我最终禁用了 SplitTunneling,而且自相矛盾的是,它似乎像我希望/期望的那样继续工作。我重新启动了几次,登录并确定在桌面加载 VPN 时已经建立。

我需要做更多的测试来确认,但这足以帮助我摆脱自己。

【讨论】:

  • 似乎也可以像这样“拆分”隧道,这实际上是通过它发送所有流量:Add-VpnConnectionRoute -ConnectionName "My VPN" -DestinationPrefix "0.0.0.0/1"Add-VpnConnectionRoute -ConnectionName "My VPN" -DestinationPrefix "128.0.0.0/1"
  • 良好的数据点。那时我对此不感兴趣,但今天可能有一个有效的用例。
【解决方案2】:

我通过在创建 VPN 连接时选中 Remember my sign-in info 复选框来做到这一点。

您可以通过确保 Get-VpnConnection 返回 RememberCredential : True 在 PowerShell 脚本中检查这一点。

如果是这种情况,那么 rasdial 应该会自动连接它。

我这样做:

<#
.SYNOPSIS
Ensures vpn connection (assumed to have saved credentials) is connected.
#>
function Connect-Vpn
{
    [CmdletBinding()]
    param (
        [object]
        $Settings
    )

    $rr1 = Get-VpnConnection -Verbose:$false | where {$_.ServerAddress -imatch $Settings.VpnConnectionPattern -and $_.RememberCredential} | Select -First 1
    if ($rr1.ConnectionStatus -ne 'Connected')
    {
        rasdial.exe $rr1.Name
        If (-not $LASTEXITCODE)
        {
            throw "Cannot connect to '$($rr1.Name)'."
        }
    }
    else
    {
        Write-Verbose "Already connected to '$($rr1.Name)'."
    }
}

您必须根据自己的需要调整此代码,因为它使用了我的设置文件中的一些字段...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2011-10-10
  • 2011-03-12
  • 2020-07-13
  • 2021-03-13
  • 2017-01-21
相关资源
最近更新 更多