treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

(2/2)バッチファイルでWindowsファイアウォール設定を実施

(1/2)バッチファイルでWindowsファイアウォール設定を実施」の続きをご報告。
バッチファイルの中身に入っていきます。

部品を作っていく⇒OS判定

OSの判定はverコマンドで取得したバージョン情報で判定します。
例えば、Windows10でverコマンドを実行すると、

f:id:treedown:20200929013653p:plain
バージョンが表記されます。
これを、findコマンドを連結して、抜き出すと、

f:id:treedown:20200929013705p:plain
こういう感じ。細かい変化ですが、抜き出した文字列だけが表示されています。
これをいつもの「if %ERRORLEVEL%」で判定して、gotoで飛ばして、終了させちゃう。
--------------------------------------------------------------
ver | find /i "Version 6.3." > nul
if %ERRORLEVEL% == 0 goto VerWin8

:VerWin8
echo Win10未満のバージョンなのでそのまま処理を終了。
goto end
--------------------------------------------------------------
echoで画面にメッセージ表示を入れていますけど、シンプルに「if %ERRORLEVEL% == 0 goto end」で終わらせればOK。

部品を作っていく⇒ファイル判定

あるアプリケーションがインストールされているかどうかを判定するために、そのアプリケーションがインストールされている場合に存在するフォルダの有無で判定することにします。以前

VLCのバージョンアップをサイレントでやってみる。 - treedown’s Report

ここでやった内容をそのまま流用。
事前にsetコマンドでファイルのフルパスを入れておいて、「if exist」文で存在確認し、存在していればそのまま何もせず終了。
--------------------------------------------------------------
set ExistingFile=%programfiles%\Microsoft\OnlineManagement\Common\omsvchost.exe

if exist "%ExistingFile%" goto end
--------------------------------------------------------------
シンプル。

部品を作っていく⇒ファイアウォールルールの判定

ファイアウォールルールは

netsh advfirewall firewall show rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private dir=in | find "有効" | find "はい"

このコマンドで既存のルールが有効かどうかを画面に表示させることができます。
※プライベートのプロファイルのみ、の場合。
判定は「if %ERRORLEVEL%」で、findコマンドで抜き出す「有効:はい」が表示されるなら「0」、それ以外(その場合「有効:いいえ」の状態になっている)には「1」で分岐させることができます。

ルールが有効ではない場合には

netsh advfirewall firewall set rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private new enable=yes

このコマンドで、ルールを有効化させる、この判定と動作を「リモート デスクトップ - ユーザー モード (TCP 受信)」と「リモート デスクトップ - ユーザー モード (UDP 受信)」の分作っていくことになります。

バッチファイル

とりあえず、"リモート デスクトップ - シャドウ (TCP 受信)"で判定して、これが有効じゃなかったら、他の二つも有効じゃないだろう、ということで、三つのルールを一変に有効化するバッチの作りにしていました。

--------------------------------------------------------------
@echo off

rem 判定対象ファイル名の入力(フルパス)
set ExistingFile=%programfiles%\Microsoft\OnlineManagement\Common\omsvchost.exe

rem 対象バージョンの確認
rem Windows10なら実行、8.1以前なら何もせず終了
ver | find /i "Version 6.3." > nul
if %ERRORLEVEL% == 0 goto VerWin8

:VerWin8
echo Win10未満のバージョンなのでそのまま処理を終了。
goto end

rem ファイルの存在確認
if exist "%ExistingFile%" goto end
rem ファイルが存在しない場合
rem echo デバッグ用msg:ファイルは存在しないので、処理を開始します。

echo リモート デスクトップ - シャドウ (TCP 受信)の判定
netsh advfirewall firewall show rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private dir=in | find "有効" | find "はい"
if %ERRORLEVEL% == 0 goto end
if %ERRORLEVEL% == 1 goto RDPON

:RDPON
rem echo "RDPswON:リモート デスクトップ - シャドウ (TCP 受信)有効の判定"
netsh advfirewall firewall set rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private new enable=yes
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (TCP 受信)" profile=private new enable=yes
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (UDP 受信)" profile=private new enable=yes
goto end

:end
set ExistingFile=
--------------------------------------------------------------

すべてに判定を追加

もうちょっと、細かく各種判定を入れたほうがいいかなぁと思い、ちょっと改訂。

--------------------------------------------------------------
@echo off

rem 判定対象ファイル名の入力(フルパス)
set ExistingFile=%programfiles%\Microsoft\OnlineManagement\Common\omsvchost.exe

rem 対象バージョンの確認
ver | find /i "Version 6.3." > nul
if %ERRORLEVEL% equ 0 goto VerWin8

:VerWin8
echo Win10未満のバージョンなのでそのまま処理を終了。
goto end

rem ファイルの存在確認
if exist "%ExistingFile%" goto end
rem ファイルが存在しない場合
rem echo デバッグ用msg:ファイルは存在しないので、処理を開始します。


echo リモート デスクトップ - シャドウ (TCP 受信)の判定
netsh advfirewall firewall show rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private dir=in | find "有効" | find "はい"
if %ERRORLEVEL% == 0 goto RDPuTCPset
if %ERRORLEVEL% == 1 goto RDPswON
:RDPswON
rem echo %ERRORLEVEL%
rem echo "RDPswON:リモート デスクトップ - シャドウ (TCP 受信)有効の判定"
netsh advfirewall firewall set rule name="リモート デスクトップ - シャドウ (TCP 受信)" profile=private new enable=yes
goto RDPuTCPset

:RDPuTCPset
netsh advfirewall firewall show rule name="リモート デスクトップ - ユーザー モード (TCP 受信)" profile=private dir=in | find "有効" | find "はい"
if %ERRORLEVEL% == 0 goto RDPuUDPset
if %ERRORLEVEL% == 1 goto RDPumtcpON

:RDPumtcpON
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (TCP 受信)" profile=private new enable=yes
echo "RDPuTCPset:次の設定に移動"

:RDPuUDPset
netsh advfirewall firewall show rule name="リモート デスクトップ - ユーザー モード (UDP 受信)" profile=private dir=in | find "有効" | find "はい"
if %ERRORLEVEL% == 0 goto end
if %ERRORLEVEL% == 1 goto RDPumudpON

:RDPumudpON
netsh advfirewall firewall set rule name="リモート デスクトップ - ユーザー モード (UDP 受信)" profile=private new enable=yes
echo "RDPuTCPset:設定完了"

:end
set ExistingFile=
--------------------------------------------------------------

結局ここまでやったけど、使わなかった、という。

残念な気もする反面、もうちょっと設定状態によるエラー処理(※)を上手くやらなきゃいけないけどどうしようという課題を考えなくて良くなったという点で、なんか複雑な心境でした。

■エラー処理(※):
前述のプロファイルが「プライベート,パブリック」と二つのプロファイルが割り当てられている場合に、判定コマンドの実行や設定反映コマンドの実行が狙い通り動作しないところ。