« GB-BACE-3000-FT-Sのファームウェアをアップデートする | トップページ | 懐かしグッズ色々と »

2018年10月20日 (土)

Windows10で切断されたVPN接続を自動で再接続する

知らぬ間にVPN接続が切れていてkancolleSnifferのデータ書き込みが失敗することが割と気になる位の頻度で発生したので。

 

以前KancolleSnifferの統計情報を共有するために自宅サーバへVPN接続する記事を書いたが、その後の運用でVPNが切れていてデータ書き込みが失敗し統計情報に反映されないことが少なからず発生した。

これを機にVPN接続が切れたら自動で再接続出来る様に設定してみた。

基本はPowerShellによるVPN接続チェックと切断時の再接続をタスクスケジューラに登録して定期的に実行する形となる。
しかしこれだとPowerShellの実行画面が一瞬ではあるが定期的に画面に表示されて視界の邪魔になるのでその辺も改善することに。

まずはPowerShellによるVPN接続状態チェックと切断時の再接続についてである。
参考にさせて頂いたサイトではIPアドレスベースで確認していたが、私の環境ではそれでは問題が発生する可能性がある為VPN接続名をチェックする形に変更した。

$A = ipconfig | Select-String VPN接続
if($A -like "*VPN接続*"){
echo "OK"
}else{
rasphone -d "VPN接続"
}

・簡単な説明
$A = ipconfig | Select-String VPN接続
ipconfigでPCのネットワーク情報が表示されるので、その中にVPN接続という文字列があるかチェックしている。
私の場合”VPN接続”という名前で自宅とVPN接続する設定を作成しているからその名前となっている。
該当する文字列があった場合、その文字列を含んだ行が変数$Aに格納される。

if($A -like "*VPN接続*"){
echo "OK"
}
変数$Aに”VPN接続”という文字列が含まれているか調べている。
上で説明したチェックで文字列が変数$Aに格納されていれば判定式は真となって下のコマンドが実行される。
正直何もする必要はないのでechoコマンドはなくてもよい気がする。

else{
rasphone -d "VPN接続"
}
上の判定式で偽となった場合、つまりVPN接続が存在しない場合にVPN接続するコマンドが実行される。
実際に私が実行しているスクリプトではもうちょっと条件を追加していて無線LAN接続が存在していて、VPN接続が存在していないときにVPN接続を行うようにしている。
つまり有線LAN接続があっても無線LAN接続しているときしかVPN接続しない設定である。

$A = ipconfig | Select-String VPN接続
$B = ipconfig | Select-String 無線LAN接続
if($A -like "*VPN接続*"){
echo "OK"
}elseif($B -like "*無線LAN接続*"){
rasphone -d "VPN接続"
}

 

あとは上記PowerShellのコマンドを適当な名前を付けて拡張子をps1で保存し、タスクスケジューラから定期的に実行すれば良いのだが、冒頭で述べた通りこのままだと定期的にPowerShellの実行画面がポップアップしてきてうざいことこの上ない。
これはPowerShell自身にバックグラウンド実行する機能がない為らしい。

その為画面をポップアップさせないように下記スクリプトをワンクッションはさむこととなる。

wsShell = WScript.createObject("WScript.Shell");
retCode = wsShell.Run("\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -File \"" + WScript.Arguments.Item(0)+"\"",0,true);
WScript.Quit(retCode);

これは参考にさせて頂いたサイトからそのまま拝借した。
やっていることはWindows Scripting Hostからバックグラウンドで動作する様にPowerShellを呼び出してPowerShellのスクリプトを処理させているとの事。

上記のコマンドを適当な名前を付けて拡張子をjsで保存し、タスクスケジューラから定期的に実行すれば邪魔なPowerShellの実行画面が表示されなくなる。

タスクスケジューラの設定は以下の通り。
Zenpan
チェックしないとタスク実行を拒否されていた。

Triggere

Sousa

Jouken

Settei

今の所5分周期で監視するように定義しているが正常に稼働しているようだ。
PC起動後にVPN接続が無いと自動的に接続し、故意にVPNを切断しても接続状態に戻っている。

と言う事で当面はこの状態で運用してみることとなる。
問題があったらその時に考えることとする。

以下に今回参考にさせて頂いたサイトを記載しておく。
情報に感謝。

「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認

Windows10でVPNを自動接続する方法

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

 

2020/03/02追記:
ちょっと前からWindows10の挙動が変わった様で、有線LANが繋がっていると無線LANの”自動的に接続”をチェックしていても自動的に無線LANに接続してくれなくなった。

この事態に対応する為にVPN接続のスクリプトを修正して無線LANも接続するように変更した。
ついでにバックグラウンドで常駐して接続を監視するように変更した。
元々タスクスケジューラで5分毎に起動していたのはPowerShellがバックグラウンド起動出来なかったからだ。
今はPowerShellもバックグラウンド起動に対応しているので常駐可能である。
よってタスクスケジューラからスクリプトを起動するタイミングを5分毎ではなく任意のユーザーがログイン時に変更した。
またタスクスケジューラから直接常駐させられなかったので以下のスクリプト経由で常駐させる形とした。

呼び出しスクリプトの内容
call_script.ps1
-------------------------------------------------------
Start-Process -FilePath powershell D:\task\keep-vpn_background.ps1 -WindowStyle hidden

タスクスケジューラの登録情報

Call_script

以下変更後の常駐スクリプト
keep-vpn_background.ps1
-------------------------------------------------------
#Powershellが英語モードで動いている様でSSID名とプロファイル名が日本語ではスクリプトが正常動作しませんでした。

#SSID 接続先の無線LANのSSIDを設定
$SSID = "WiFi-AP_Home"

#Profile name 接続する無線LANのプロファイル名を設定。通常はSSIDと同じ
$PFN = "WiFi-AP_Home"

#WiFi Gateway IP addoress WiFi接続時に配布されるゲートウェイIPアドレスを設定
$WLGW = "192.168.0.1"

#変数の初期化
$WLGWIP = $null;
$VPNCON = $null;
$W = $null;
$WL = $null;

while(1){

#WiFi APへ接続
#目的のSSIDが見えていれば接続する。
#すでに接続している場合、またはSSIDが見えない場合は何もしない。
#違う無線LANに接続している場合も何もしない。

    $WL = netsh wlan show network | Select-String $SSID
    if($WL -like "*$SSID*"){
        $W = netsh wlan show interface | Select-String connected
        if($W -like "*disconnected*"){
            netsh wlan connect name="$PFN"
            Start-Sleep -s 10
            for($i=10; $i -ge 0; $i--){
                $W = $null;
                $W = netsh wlan show interface | Select-String connected
                if($W -like "*disconnected*"){
                    echo "connecting failed"
                }elseif($W -like "*connected*"){
                    echo "connecting success"
                    $i=-1
                }
            }
#無線LAN接続とVPN接続が同時に切れて無線LAN再接続後すぐにVPN接続に行くとエラーになる場合があるので時間調整。
#各自環境に合わせて調整、私の環境では大体60秒程度でOK。
            Start-Sleep -s 65
        }elseif($W -like "*connected*"){
            echo "WiFi connected"
        }
    }else{
        echo "No WiFi AP or Disable WiFi Adapter or Connect other WiFi AP"
    }

#VPNを接続
#ネットワーク情報を確認しVPN接続があるかどうか確認。
#接続していない場合、無線LANが接続しているとVPN接続しに行く。
#違う無線LANに接続している場合と、すでにVPN接続している場合は何もしない。

    $WLGWIP = ipconfig | Select-String $WLGW
    $VPNCON = ipconfig | Select-String $PFN
    if($VPNCON -like "*$PFN*"){
        echo "VPN connecting"
    }elseif($WLGWIP -like "*$WLGW*"){
        rasphone -d $PFN
        while($VPNCON -like "*$PFN*"){
            Start-Sleep -s 5
            $VPNCON = ipconfig | Select-String $PFN
        }
    }
    $WLGWIP = $null;
    $VPNCON = $null;
    $W = $null;
    $WL = $null;
#以下の秒数待機後に処理の最初に戻る。
    Start-Sleep -s 60
}

|

« GB-BACE-3000-FT-Sのファームウェアをアップデートする | トップページ | 懐かしグッズ色々と »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Windows10で切断されたVPN接続を自動で再接続する:

« GB-BACE-3000-FT-Sのファームウェアをアップデートする | トップページ | 懐かしグッズ色々と »