有鑑於近日台灣 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
是關鍵設定!
以下是幾個重要參數的說明:
- 為了將 VPN 連線註冊到全域的電話簿 (global phone book),所以我們要加上
-AllUserConnection
參數!
- 由於我們公司的 VPN 採用 L2TP (Layer 2 Tunneling Protocol) 協定進行連線,所以必須指定正確的 Pre-shared key (
PSK
) 才能成功連線,因此需要加上 -L2tpPsk $L2tpPsk
才行,這個參數只有在使用 -TunnelType L2tp
的時候才能用。
- 我們公司的網路有透過 Active Directory (AD) 進行管理,所以加上預設 DNS 尾碼會比較方便,所以加上
-DnsSuffix $DNSSuffix
參數。
- 當你第一次登入 VPN 之後,如果想要記憶密碼,可以加上
-RememberCredential
參數。
- 如果你的
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)!
快速撥接 VPN 連線
我前幾年有寫過一篇 如何透過命令提示字元快速連接 Windows 內建的 VPN 連線 文章,其中所使用到的工具程式 rasdial.exe
就是專門用來呼叫 RAS 電話簿中的網路連線。
如果你是使用 PowerShell 的 Add-VpnConnection 新增的 VPN 連線,雖然可以透過 rasphone
可以看到這些連線設定,但是無法自動撥接出去,雖然可以記憶密碼,但你一定會看到以下畫面,只要按下 Enter
鍵就可以自動連線:
會出現這個問題,就是因為你在透過 Add-VpnConnection
時,沒有加上 -AllUserConnection
參數的緣故。因為唯有加上 -AllUserConnection
才能將連線註冊到系統的 RAS 電話簿之中! 🔥
撥接 VPN 時免輸入密碼的方法
我們可以使用 rasdial.exe
工具,幫助我們自動撥接 VPN 連線,以下就是進行特別設定的方法:
-
請以系統管理員權限開啟 Notepad 或任意文字編輯器
打開 %ProgramData%\Microsoft\Network\Connections\Pbk\rasphone.pbk
檔案
注意: 此檔案為 UTF-8
編碼,如果你的 VPN 連線名稱有使用中文,可能會出現亂碼的情況,請記得使用正確的文字編碼開啟檔案。
-
調整設定無互動自動撥接 VPN 連線的參數
上一個步驟的 rasphone.pbk
檔案,其實是一個 INI
文字檔,如果你有設定兩個不同的 VPN 連線,那麼這個檔案就會有兩個區段設定,請記得要調整正確的參數。
你必須找到一個 PreviewUserPw=1
參數,其值預設為 1
,你必須把他改成 0
之後儲存檔案,才能進行下一步。
-
執行 rasphone -d "MyVPN"
命令來撥接
其中 MyVPN
是你在建立 VPN 連線時所指定的連線名稱!
撥接 VPN 的過程中畫面會出現以下視窗,但是不會出現太久,當 VPN 連線成功後就會自動消失:
上述三個步驟都設定成功,就代表你已經可以免密碼自動撥接 VPN 了!
今後就只要執行以下命令就可以自動撥接/掛斷 VPN,而且還不用將連線密碼寫死在批次檔或 AutoHotkey 的指令檔中:
-
撥接 VPN
rasphone -d "MyVPN"
-
掛斷 VPN
rasphone -h "MyVPN"
設定 AutoHotkey 自動連線
以下是我寫好的 AutoHotkey 命令腳本:
-
撥接 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
-
掛斷 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
相關連結