KUSONEKOの見る世界

自動でVPN接続と接続維持させる方法 Windows7以降

実家のPCが起動時に自宅のVPNサーバに接続するように設定したときのメモです。
また、VPN接続維持のため、Powershellを使用しますが、参考にしたサイトのままだとできなかったため修正内容も記載しておきます。
PC起動時に自動的にVPN接続するタスクスケジューラを作成しますが、
もし切れてしまった時のために、VPN接続維持のタスクスケジューラも作成しておきます。
タスクスケジューラは、ファイル名を指定して実行から『taskschd.msc /s』を実行すると楽です。

PC起動時にVPN接続するタスク

  1. [タスクの作成]をクリック
  2. [全般]タブ
    名前(M):『VPN接続』を入力(任意)
    [セキュリティ オプション]
    『ユーザーがログオンしているかどうかにかかわらず実行する(W)』を選択
    『最上位の特権で実行する(I)』をチェック
  3. [トリガー]タブ
    [新規(N)...]をクリック
    タスクの開始(G):『スタートアップ時』を選択
    [詳細設定]
    『遅延時間を指定する(T):』をチェックし、『1分間』を選択
    [OK]をクリック
  4. [操作]タブ
    [新規(N)...]をクリック
    プログラム/スクリプト(P):『rasphone』を入力
    引数の追加 (オプション)(A):『-d "VPN"』を入力(VPN設定時の接続名)
    [OK]をクリック
  5. [条件]タブ
    [電源]
    『コンピューターを AC 電源で使用している場合のみタスクを開始する(P)』のチェックをはずす (念のため)
    [ネットワーク]
    『次のネットワーク接続が使用可能な場合のみタスクを開始する(Y):』をチェック
  6. [設定]タブ
    『タスクが失敗した場合の再起動の間隔(T):』をチェック
    再起動試行の最大数(R):『10』にする。
    [OK]をクリック
  7. パスワードを聞かれるので入力する

VPN接続の維持をするタスク

こちらのサイト様で紹介されているPowershellを改造させて頂きました。
Windows 8 以降のPowershellでは存在しない文字列をSelect-Stringして格納した変数のLengthが"0"になるようですが、Windows 7 では”0”にならないため、うまく動きません。
そのため、if文の結果を逆にしました。
これでWindows 7以降で使えるようになります。
  1. VPN接続維持用のPowershellを作成
    Cドライブ直下に『VPN接続維持.ps1』というファイルを作成し、内容を以下にする
    $A = ipconfig | Select-String 172.31.255
    
    if($A -like "*172.31.255*"){
       echo "OK"
    }else{
       rasphone -d "VPN"
    }
    
    ※172.31.255は、VPN接続時に払い出されるIPのネットワークアドレスを指定。アドレスが見つからない場合はVPNを再接続します。
  2. タスクスケジューラで、[タスクの作成]をクリック
  3. [全般]タブ
    名前(M):『VPN接続維持』を入力
    [セキュリティ オプション]
    『ユーザーがログオンしているかどうかにかかわらず実行する(W)』を選択
    『最上位の特権で実行する(I)』をチェック
  4. [トリガー]タブ
    [新規(N)...]をクリック
    タスクの開始(G):『スケジュールに従う』を選択
    [設定]
    『毎日』を選択
    『開始(S):』の時刻を『0:00:00』にする
    『間隔(C):』を『1』日にする
    [詳細設定]
    『繰り返し間隔(P):』をチェックし、『30分間』を選択
    [OK]をクリック
  5. [操作]タブ
    [新規(N)...]をクリック
    プログラム/スクリプト(P):『C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe』を入力
    引数の追加 (オプション)(A):『-c "C:\VPN接続維持.ps1"』を入力
    [OK]をクリック
  6. [条件]タブ
    [電源]
    『コンピューターを AC 電源で使用している場合のみタスクを開始する(P)』のチェックをはずす (念のため)
    [ネットワーク]
    『次のネットワーク接続が使用可能な場合のみタスクを開始する(Y):』をチェック[OK]をクリック
  7. パスワードを聞かれるので入力する

2019/03/19 追記

『VPN接続の維持をするタスク』を実行して、(0x1)で失敗したり、リターン コード: 2147942401 が表示された場合は、以下の対処をします。

PowerShellを管理者として実行し、以下のコマンドを入れる。
PS C:\Windows\system32> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y



匿名2020年2月3日 20:28

参考にさせていただきました。ありがとうございます。もっと早く(Windows 7のときに)読んでいたらもっと楽できたと悔やんでいます。

やってみて思ったのですが、「PC起動時にVPN接続するタスク」と「VPN接続の維持をするタスク」のタスクは分ける必要があるのでしょうか?
後者のタスクの[トリガー]を、「スタートアップ時」「繰り返し間隔(P): 30分間」「継続時間(F): 無制限」と設定するだけで前者のタスクは不要になる気がします。
この場合の懸念点などがございましたらご教示いただきたいです。

KUSONEKO2020年2月3日 21:46

コメントありがとうございます。

当時これを設定したのは以下の考えからでした。

『PC起動時にVPN接続するタスク』
→実家のPCを再起動させたとしても、なるべく早くVNCで入れるようにしたい。
→じゃあ、起動時になるべく早くVPN接続させるようにしよう。
スタートアップ直後ではネットワークが繋がっていなくて失敗する恐れがあるから、
1分間隔で10回リトライさせよう。

『VPN接続の維持をするタスク』
→もし、VPNが切れてしまった場合に再接続させたい。
でもあまり頻度が高いと負荷になりそうだから30分間隔でいいや。
失敗しても、次の30分後でいいだろう。

起動時の失敗を許容できれば、一つにできると思います。

あとよく覚えていないのですが、
タスク失敗の判定が良く分からなかったり、タスクが失敗するともう動いてくれなかったり、
一つのタスクで複数回のVPN接続が発生したりで、これに落ち着いたような記憶があります。
もっといい方法があったかもしれません。