1987年にプログラミング言語「Perl」を開発したラリー・ウォール氏は、プログラマの三大美徳として以下の3つを提唱しています。
- 怠惰 (Laziness)
- 短気 (Impatience)
- 傲慢 (Hubris)
この三大美徳は有名なので、ググればいろいろと出てきますが、私は今回このうち「怠惰」を強く感じてしまいました。
さて、学校または職場では固定IPを使用していても、自宅ではDHCPという方は多いのではないでしょうか。
これを、毎日のように[コントロールパネル]の[ネットワークと共有センター]…から変更していてはあまりに面倒です。
いろいろと調べたところ、バッチファイルを使えば、数クリックするだけで毎回IPアドレス等を入力することなく、IPアドレスを切り替えられるようです。
つまり、静的(固定)IPに切り替える用・動的IPに切り替える用それぞれのバッチファイルを作成し、それらを実行することで簡単に切り替える、というわけですね。
ただ、静的(固定)IPアドレスに切り替えるときはこっちのバッチファイル、動的IPアドレスに切り替えるときはこっちのバッチファイルというのが面倒臭い。
1つのバッチファイルでこれらを交互に切り替えられないものか…。
また、毎回右クリックして[管理者として実行(A)]を選ぶのも面倒臭い。
というわけで、徹底的に怠惰になり、いろいろと調べて自作してしまいました。
強制的に管理者として実行
強制的に管理者として実行する手段は下記を参照しました。
whoami /priv | find "SeDebugPrivilege" > nul if %errorlevel% neq 0 ( @powershell start-process "%~0" -verb runas echo 管理者権限がありません。管理者権限で実行します。 exit ) echo 管理者権限に自動で昇格できました。
whoamiコマンドは、一般権限と管理者権限で取得できる情報に大きな差があります。
そこで、その性質を利用して、whoamiコマンドの出力結果を管理者権限でしか出力されない結果である特権名[SeDebugPrivilege]で検索し、見つからなかった場合(%errorlevel% neq 0
のとき)は一般権限と判断します。
静的・動的IPアドレスを交互に切替
交互に切り替えるにはどうするかよいか、考えてみました。
その手段として、上記で利用したコマンドの出力結果を検索し、%errorlevel% neq 0
で見つかった場合と見つからなかった場合を条件分岐させる方法が使えそうです。
具体的には、ipconfigコマンドで検索して、静的IPとして指定したいIPアドレスが見つかれば既に静的IPアドレスが有効と判断し、そうでなければ動的IPアドレスが有効と判断する方策です。
こんな感じになります。
ipconfig | find %IPADDR% > nul if %errorlevel% neq 0 ( echo 現在動的IPのため、静的IPに切り替えます。 netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1 netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no netsh interface ipv4 add dnsservers name=%IFNAME% %DNS2% index=2 validate=no ) else ( echo 現在静的IPのため、動的IPに切り替えます。 netsh interface ipv4 set address name=%IFNAME% dhcp netsh interface ipv4 set dnsservers name=%IFNAME% dhcp )
結論
上記を踏まえて、最終的に完成したのが下記のコードです。
メモ帳にまるごとCopy&Pasteして、「任意の名前.bat」という名前で保存していただき、「各種設定を変数に格納」のところ(8~12行目)を適切にご設定いただければご利用いただけます。
@echo 静的・動的IPアドレス切替処理 実行中 ::######################################## ::# 各種設定を変数に格納 ::######################################## set IFNAME="Wi-Fi" set IPADDR="xxx.xxx.xxx.xxx" set MASK="xxx.xxx.xxx.xxx" set GW="xxx.xxx.xxx.xxx" set DNS1="xxx.xxx.xxx.xxx" set DNS2="xxx.xxx.xxx.xxx" ::######################################## ::# 管理者権限で実行されていない場合、自動で管理者権限に昇格する ::######################################## whoami /priv | find "SeDebugPrivilege" > nul if %errorlevel% neq 0 ( @powershell start-process "%~0" -verb runas echo 管理者権限がありません。管理者権限で実行します。 exit ) echo 管理者権限に自動で昇格できました。 ::######################################## ::# 静的・動的IPアドレスを交互に切り替え ::######################################## ipconfig | find %IPADDR% > nul if %errorlevel% neq 0 ( echo 現在動的IPのため、静的IPに切り替えます。 netsh interface ipv4 set address name=%IFNAME% static %IPADDR% %MASK% %GW% 1 netsh interface ipv4 set dnsservers name=%IFNAME% static %DNS1% primary validate=no netsh interface ipv4 add dnsservers name=%IFNAME% %DNS2% index=2 validate=no ) else ( echo 現在静的IPのため、動的IPに切り替えます。 netsh interface ipv4 set address name=%IFNAME% dhcp netsh interface ipv4 set dnsservers name=%IFNAME% dhcp ) ipconfig /all pause exit
プログラマの三大美徳を発揮し、皆さんどんどん良い意味での楽をしましょう!