Add-VpnConnection: PSK が壊れる理由とアドレスが残る理由
PowerShell は二重引用符で囲んだ事前共有キーを cmdlet が保存する前に展開し、稼働中のトンネルは再接続するまで古いアドレスを保持します。
Windows の VPN プロファイルは電話帳の一項目であり、PowerShell はその項目を編集する手段のひとつです。この違いから二つの失敗が生まれます。サーバーに届く前に壊れている事前共有キーと、更新されたように見えて次のトンネルが実際に呼び出す先ではないサーバーアドレスです。どちらも、プロファイルを実行したコマンドではなく保存された状態として扱うと見えやすくなります。以下の流れは編集の順序に従います。作成、変更、スコープ、読み戻しです。
リテラルなキーでプロファイルを作成する
Add-VpnConnection は L2TP の事前共有キーを -L2tpPsk を通じて受け取ります。PowerShell は cmdlet が受け取る前に文字列を処理し、二重引用符の中ではドル記号が変数参照を始め、バッククォートがエスケープを始めます。どちらかを含むキーは短くなって、あるいは別の文字に変わって届き、プロファイルは誤った秘密で正常に作成されます。
その後、失敗は IPsec 認証で現れ、トンネルは上がりません。引用の誤りがサーバー側の問題として報告されがちなのはこのためです。プロファイルは存在し、名前も正しく、秘密だけが静かに間違っています。
| How you write it | What PowerShell does | Result |
|---|---|---|
| "p@ss$word!42" | Expands $word as a variable | Stored key is truncated |
| Double-quoted with an escape character | Consumes the next character as an escape | One character disappears |
| 'p@ss$word!42' | Keeps the literal characters | Stored key matches the secret |
単一引用符が解決策であり、値全体を囲む必要があります。すでに誤ったキーで項目が存在する場合は -Force が置き換えます。そうでなければプロファイルを削除して作り直し、新しい接続で試します。
Add-VpnConnection -Name "Contoso-L2TP" -ServerAddress vpn.contoso.example -TunnelType L2tp -L2tpPsk 'n3w$ecret!2026' -AuthenticationMethod Pap -RememberCredential -Force
本当の秘密はシェルの履歴や共有スクリプトに残さないでください。実行時に承認済みの保管場所から読み取り、リテラルではなく変数を渡せば、引用の問題を完全に避けられます。
アドレスを変更してから再接続する
Set-VpnConnection は代入構文ではなくスペース区切りのパラメーターを取ります。-ServerAddress = "203.0.113.10" と書くと余分なトークンが渡され、cmdlet はエラーを出すか、意図しない値を保存します。正しい形式は -Name "Office L2TP" -ServerAddress 203.0.113.10 です。
構文が正しくても、すでに上がっているトンネルには変更が届きません。確立済みの接続は切断するまで発信したアドレスを保持するため、同じセッションを試しても新しい値の証明にはなりません。切断し、編集し、再接続し、接続の詳細で相手のアドレスを確認してください。
その場で変更できないプロパティもあります。cmdlet が拒否したら既存のパラメーターを記録し、プロファイルを削除して修正した値で作り直し、元のトンネルと認証の設定を保ちます。電話番号だけを変えたいスクリプトは、すべてを作り直す代わりに RAS API で電話帳の項目を編集できます。どの経路を選んでも、後で保存された値を確認し、コマンドの無言を信じないでください。
どの電話帳を編集したかを知る
ユーザーごとのプロファイルはそのユーザーのネットワーク接続ディレクトリにあり、すべてのユーザーのプロファイルはプログラムデータのツリーの下にあるマシン全体のディレクトリにあります。これらはスコープの異なる別の項目であり、一方を編集しても他方はそのままです。
変更が消えたように見えるのはそのためです。スクリプトはあるアカウントで実行され、テストは別のアカウントで実行されました。プロファイルがマシンのものなら -AllUserConnection を使い、読み戻すときも同じスコープを確認してください。
テストの前にプロファイルを読み戻す
渡した値ではなく、Windows が保存した値を尋ねます。
Get-VpnConnection -Name "Office L2TP" | Select-Object Name, ServerAddress, TunnelType, AuthenticationMethod
その出力を意図と比較し、それから新しい接続を開始します。発信が失敗したら、プロファイルを再び変更する前にイベントビューアーの RAS クライアントのログを確認してください。ログは失敗した段階を示します。
編集中は認証の設計を崩さないでください。アドレスを変えても証明書や EAP の構成を落とすコマンドは、編集とは無関係に見える失敗を生みます。動作するプロファイルを先にエクスポートしておけば、推測ではなく復元できる材料が手に入ります。