The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何透過 PowerShell 快速建立 Windows 內建 VPN 連線並自動記憶密碼連線

有鑑於近日台灣 COVID-19 疫情 相當嚴峻,政府也在前幾日宣布全台疫情警戒升第三級,我們公司也在 2021/5/17 開始全員在家上班,以致於使用 VPN 的同仁暴增,進而也遇到許多連線問題。本篇文章我要來分享幾個快速建立 VPN 的 PowerShell 命令,幫助大家在不瞭解 VPN 背景知識的情況下,也能快速且正確的設定好 VPN 連線。

快速設定 VPN 連線

以下是我們公司用來快速建立 VPN 連線的 PowerShell 指令碼,請以系統管理人員身份開啟執行:

$VPNProfile = "MyVPN"

$VPNServer = "IP.Address"
$DNSSuffix = "AD.Domain"
$L2tpPsk   = "L2TP 的 Pre-shared key (PSK)"

Add-VpnConnection -Name $VPNProfile -AllUserConnection -ServerAddress $VPNServer -TunnelType L2tp -L2tpPsk $L2tpPsk -DnsSuffix $DNSSuffix -Force -RememberCredential

🔥 注意: 這裡加上 -AllUserConnection 是關鍵設定!

以下是幾個重要參數的說明:

  1. 為了將 VPN 連線註冊到全域的電話簿 (global phone book),所以我們要加上 -AllUserConnection 參數!
  2. 由於我們公司的 VPN 採用 L2TP (Layer 2 Tunneling Protocol) 協定進行連線,所以必須指定正確的 Pre-shared key (PSK) 才能成功連線,因此需要加上 -L2tpPsk $L2tpPsk 才行,這個參數只有在使用 -TunnelType L2tp 的時候才能用。
  3. 我們公司的網路有透過 Active Directory (AD) 進行管理,所以加上預設 DNS 尾碼會比較方便,所以加上 -DnsSuffix $DNSSuffix 參數。
  4. 當你第一次登入 VPN 之後,如果想要記憶密碼,可以加上 -RememberCredential 參數。
  5. 如果你的 PSK 會透過不安全的頻道傳送,必須加上 -Force 才能設定成功。

完整的參數說明請看 Add-VpnConnection (VpnClient) | Microsoft Docs 文件。

關於 RAS 電話簿

我們經常會說 VPN 要用「撥接」的方式進行連線,這個概念自然來自於傳統的「電話簿」(Phone Book),然後概念也確實一樣,我們上述建立 VPN 連線的過程,其實就是建立到 Windows 10 內建的 RAS (Remote Access Services) 電話簿中。

你可以執行 rasphone 命令(C:\Windows\System32\rasphone.exe)來啟動網路連線的視窗,而你從執行檔的名稱就可以看出這其實就是 RAS 電話簿 (RAS Phone Books)!

Network Connections (rasphone.exe)

快速撥接 VPN 連線

我前幾年有寫過一篇 如何透過命令提示字元快速連接 Windows 內建的 VPN 連線 文章,其中所使用到的工具程式 rasdial.exe 就是專門用來呼叫 RAS 電話簿中的網路連線。

如果你是使用 PowerShell 的 Add-VpnConnection 新增的 VPN 連線,雖然可以透過 rasphone 可以看到這些連線設定,但是無法自動撥接出去,雖然可以記憶密碼,但你一定會看到以下畫面,只要按下 Enter 鍵就可以自動連線:

image

會出現這個問題,就是因為你在透過 Add-VpnConnection 時,沒有加上 -AllUserConnection 參數的緣故。因為唯有加上 -AllUserConnection 才能將連線註冊到系統的 RAS 電話簿之中! 🔥

撥接 VPN 時免輸入密碼的方法

我們可以使用 rasdial.exe 工具,幫助我們自動撥接 VPN 連線,以下就是進行特別設定的方法:

  1. 請以系統管理員權限開啟 Notepad 或任意文字編輯器

    打開 %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk 檔案

    注意: 此檔案為 UTF-8 編碼,如果你的 VPN 連線名稱有使用中文,可能會出現亂碼的情況,請記得使用正確的文字編碼開啟檔案。

  2. 調整設定無互動自動撥接 VPN 連線的參數

    上一個步驟的 rasphone.pbk 檔案,其實是一個 INI 文字檔,如果你有設定兩個不同的 VPN 連線,那麼這個檔案就會有兩個區段設定,請記得要調整正確的參數。

    你必須找到一個 PreviewUserPw=1 參數,其值預設為 1,你必須把他改成 0 之後儲存檔案,才能進行下一步。

  3. 執行 rasphone -d "MyVPN" 命令來撥接

    其中 MyVPN 是你在建立 VPN 連線時所指定的連線名稱!

    撥接 VPN 的過程中畫面會出現以下視窗,但是不會出現太久,當 VPN 連線成功後就會自動消失:

    Connecting to DuotifyVPN

上述三個步驟都設定成功,就代表你已經可以免密碼自動撥接 VPN 了!

今後就只要執行以下命令就可以自動撥接/掛斷 VPN,而且還不用將連線密碼寫死在批次檔AutoHotkey 的指令檔中:

  • 撥接 VPN

    rasphone -d "MyVPN"
    
  • 掛斷 VPN

    rasphone -h "MyVPN"
    

設定 AutoHotkey 自動連線

以下是我寫好的 AutoHotkey 命令腳本:

  1. 撥接 VPN ( 快速鍵: Ctrl-Alt-Shift-V )

    ^!+v::
    RunWait, rasdial.exe VPNName, C:\Windows\System32, Hide|UseErrorLevel
    if (ErrorLevel) {
        TrayTip, 啟動 VPN 連線, 連線至 VPN 發生錯誤 (%A_LastError%), 3, 3
    } else {
        TrayTip, 啟動 VPN 連線, 成功連線至 VPN  (%A_LastError%), 3, 1
    }
    return
    
  2. 掛斷 VPN ( 快速鍵: Ctrl-Alt-Shift-D )

    ^!+d::
    RunWait, rasdial.exe VPNName /DISCONNECT, C:\Windows\System32, Hide|UseErrorLevel
    if (ErrorLevel) {
        TrayTip, 啟動 VPN 連線, 中斷 VPN 連線發生錯誤  (%A_LastError%), 3, 3
    } else {
        TrayTip, 啟動 VPN 連線, 已中斷 VPN 連線 (%A_LastError%), 3, 1
    }
    return
    

上述 AutoHotkey 腳本中,TrayTip 命令會讓你連線成功或失敗時顯示通知訊息。

如果你是 Windows 10 用戶,且使用 TrayTip 完全沒效果,請用以下 Chocolatey 命令重新安裝 AutoHotkey 才會正常運作:

choco install autohotkey.install --params="'/DefaultVer:U32'"

相關討論:https://www.autohotkey.com/boards/viewtopic.php?p=261485#p261485

相關連結