Windows10 で 2 つの Gateway を交互に切り替える PowerShell のスクリプト

Windows
この記事は約5分で読めます。
スポンサーリンク

はじめに

 筆者宅のネットワーク環境は PPPoE 接続と DS-Lite 接続による IPv4 通信を併用出来るものにした。
 これはネットワーク内に Gateway が 2 つ存在し、どちらを Default Gateway に設定するかで経路が決まる仕組み。
 Gateway を手早く切り替えて経路を変えたい場合は、今回作成した PowerShell のスクリプトを実行するだけでもう一方の Gateway に切り替える事が出来るようになる。

PowerShell のスクリプト

 作成したスクリプトは以下の通り。
 冒頭の変数 $ip4, $if_name, $pppoe, $dslite を各自適切に設定することで流用が出来るハズ。
 保存する時は Windows10 の言語設定に合わせた文字コードで保存する必要がある。デフォルトなら SJIS で。

# IPv4 の経路を PPPoE、DS-Lite 交互に Switch するスクリプト
# ** 要管理者権限 **

$ip4 = "192.168.1.11"           # 割り当てている IP アドレス
$if_name = "イーサネット"       # Interface の Alias 名。以下のコマンドで確認可能。
                                # Get-NetIPAddress | sort InterfaceAlias | select InterfaceAlias,IPAddress

$pppoe = "192.168.1.1"          # PPPoE 担当 Gateway の IP アドレス
$dslite = "192.168.1.2"         # DS-Lite 担当 Gateway の IP アドレス

# Default Gateway の設定値を取得
$a = Get-WmiObject Win32_NetworkAdapterConfiguration | select -ExpandProperty DefaultIPGateway

# 取得した Default Gateway の IP アドレスによって削除/設定する IP アドレスをセット
if ( $a -eq $pppoe ) {
    # PPPoE to DS-Lite
    $gw_now = $pppoe
    $gw_new = $dslite
} else {
    # DS-Lite to PPPoE
    $gw_now = $dslite
    $gw_new = $pppoe
}

# 一旦現在の設定をクリア
Remove-NetIPAddress -InterfaceAlias $if_name -AddressFamily "IPv4" -IPAddress $ip4 -DefaultGateway $gw_now -Confirm:$false

# 新たに設定を行う
New-NetIPAddress -InterfaceAlias $if_name -AddressFamily "IPv4" -IPAddress $ip4 -PrefixLength 24 -DefaultGateway $gw_new

 InterfaceAlias は次の様にコマンドを打ち込めば確認が可能。
 IPAddress がスクリプトを実行する PC に割り当てられた IPv4 アドレスとなっている行の InterfaceAlias がそれ。大体は「イーサネット」になっていると思う。

Get-NetIPAddress | sort InterfaceAlias | select InterfaceAlias,IPAddress

InterfaceAlias                IPAddress
--------------                ---------
Loopback Pseudo-Interface 1   127.0.0.1
Loopback Pseudo-Interface 1   ::1
イーサネット                        192.168.1.11
イーサネット                        2405:6581:1a80:0:xxxx:xxxx:xxxx:xxxx
イーサネット                        2405:6581:1a80:0:xxxx:xxxx:xxxx:xxxx
イーサネット                        fe80::xxxx:xxxx:xxxx:xxxx
ローカル エリア接続* 1                 fe80::xxxx:xxxx:xxxx:xxxx
ローカル エリア接続* 1                 169.254.xxx.xxx
ローカル エリア接続* 2                 fe80::xxxx:xxxx:xxxx:xxxx
ローカル エリア接続* 2                 169.254.xxx.xxx

使い方

 上記スクリプトを例えば switch_gateway.ps1 という名前で保存したとすると、次の様にバッチファイルでラップしてあげる。

@echo off

powershell.exe -NoProfile -ExecutionPolicy Unrestricted -File "path\to\switch_gateway.ps1"

 そしてこのバッチファイルのショートカットをデスクトップ上に作成し、ショートカットのプロパティーから ショートカット のタブにある 詳細設定 をクリックし、「管理者として実行」にチェックを入れておいてあげる。
 こうすることでショートカットをダブルクリックすれば管理者権限でバッチファイルから switch_gateway.ps1 が呼び出されて実行されることとなる。

おわりに

 今までは netsh コマンドを用いてバッチファイルを 2 つ用意して Gateway を切り替えていた。
 しかし netsh コマンドは将来的に廃止される方向との事だし、PC を再起動すると NIC の IPv4 設定から Gateway の項目が空欄になってしまうので、今後も息が長くなりそうな PowerShell を採用してみた。
 PowerShell で設定する分には NIC の設定が飛んだりしなかったので正解だったようで。

スポンサーリンク
著者プロフィール
ぶっち

本格的に PC へ触れ始めてたのは 1990 年位から。
興味は PC 全般。OS は Windows と Linux などを嗜む。
プログラマやネットワークエンジニアを経てフリーに活動している 2 児の父なアラフォーのおじさんです。

ぶっちをフォローする
ぶっちろぐ

コメント

タイトルとURLをコピーしました