Windowsファイアウォールの定義をPowerShellでCSV出力する

IT

Windowsファイヤウォールの定義をコマンド出力したい場合、よく知られているコマンドでは、加工しづらいデータが出力されます。

加工しやすいCSVファイルで出力するには、GUIでエクスポートするやり方が知られています。

1、2台や1回や2回であればGUIでも良いですが、複数台や複数回に渡りWindowsサーバにRDPしてGUI操作でデータを取得するのは手間がかかります。

遠隔コマンド(CUI)で、かつ加工しやすい形(CSV)で取得できるようにしたいと思い、Webを調べましたが、良い方法が出てきませんでした。

本記事では、筆者が試行錯誤して見つけ出した、Windowsファイヤウォール定義のCSV出力コマンドをご紹介します。

Windowsファイヤウォールの定義を出力する一般的なコマンド

Windowsファイアウォールの定義を取得するためのよく知られているコマンドです。

コマンドプロンプトを開いて下記コマンドを実行します。下記コマンドでは受信の規則を取得します。


netsh advfirewall firewall show rule name=all dir=in > wf_in.txt

実行結果として、「wf_in.txt」が出力され、下記のようなデータが得られます。(一部を抜粋)


規則名:                               Google Chrome(mDNS インバウンド)
----------------------------------------------------------------------
有効:                                 はい
方向:                                 入力
プロファイル:                         ドメイン,プライベート,パブリック
グループ:                             Google Chrome
ローカル IP:                          任意
リモート IP:                          任意
プロトコル:                           UDP
ローカル ポート:                      5353
リモート ポート:                      任意
エッジ トラバーサル:                  いいえ
操作:                                 許可

規則名:                               Spotify Music
----------------------------------------------------------------------
有効:                                 はい
方向:                                 入力
プロファイル:                         ドメイン,プライベート,パブリック
グループ:                             {78E1CD88-49E3-476E-B926-580E596AD309}
ローカル IP:                          任意
リモート IP:                          任意
プロトコル:                           TCP
ローカル ポート:                      57621-57631
リモート ポート:                      任意
エッジ トラバーサル:                  いいえ
操作:                                 許可

規則名:                               Spotify Music
----------------------------------------------------------------------
(以下略)

このデータ自体は見やすいですが、エクセルに読み込むことはできないですね。

Windowsファイヤウォールの定義をCSV出力する方法(GUI)

続いて、Windowsファイアウォール定義をGUIでCSV出力してみます。

Windowsキーを押下して、「wf.msc」と入力しエンターキーを押下します。

今回は「受信の規則」をエクスポートするので、左メニューの「受信の規則」をクリックします。

利用しているサービスが丸見えなのでモザイクを入れてます。

メニューの「操作」-「一覧のエクスポート」をクリックします。

ファイル保存ダイアログが開くので、保存フォルダを指定し、ファイル名を入力します。
「ファイルの種類」で「テキスト(コンマ区切り)(*.csv)」を指定して、「保存」ボタンをクリックします。

本操作によりカンマ区切り(CSV)の一覧データが得られます。

これならエクセルに読み込めますが、GUI操作を行わなければなりません。

Windowsファイヤウォールの定義をCSV出力する方法(PowerShell)

コマンドでWindowsファイヤウォールの受信規則定義をCSV出力する方法をご紹介します。

まず、PowerShellを管理者実行します。

Windowsキーを押下し、「powershell」と入力、表示される「Windows Power Shell」を右クリックし、「管理者として実行」をクリックします。

まずは、下記コマンドを実行し、カレントディレクトリをデスクトップに移動します。


cd $env:HOMEPATH/Desktop

下記コマンドを実行します。複数行ありますが、一つのコマンドです。すべてコピーし、PowerShellの画面に貼り付けます。

完了まで数分かかる場合があります。


Get-NetFirewallRule | Where-Object {$_.enabled -eq "true" -and $_.direction -eq "inbound"} |
ForEach-Object{
$Rule = $_
$Port = $_ | Get-NetFirewallPortFilter
$Addr = $_ | Get-NetFirewallAddressFilter
$App = $_ | Get-NetFirewallApplicationFilter
$Sec = $_ | Get-NetFirewallSecurityFilter
[pscustomobject]@{
Name = $Rule.DisplayName
Group = $Rule.Group
Profile = $Rule.Profile
Enabled = $Rule.Enabled
Action = $Rule.Action
Override = $Sec.OverrideBlockRules
Program = $App.Program
LocalAddress = $Addr.LocalAddress
RemoteAddress = $Addr.RemoteAddress
Protocol = $Port.Protocol
LocalPort = $Port.LocalPort
RemotePort = $Port.RemotePort
}
} | export-csv wf_in.csv -encoding default


得られた出力がこちらです。(一部抜粋)

出力したい下記項目がCSVで出力できました。

  • ルール名
  • アクション
  • 有効無効
  • ローカルアドレス
  • リモートアドレス
  • プロトコル
  • ローカルポート
  • リモートポート

筆者のつぶやき

PowerShellと僕は馬が合いません。

これだけのコマンドを書き上げるのに、3時間も要しました。。

さらに、上記出力の画面ショットではわかりませんが、上記コマンドで取得したローカルアドレスやリモートアドレスは、なんと以下のような表記になります。

192.168.1.10/255.255.254.0

こんな表記見たことがありません。笑

そこで英雄「Python」の力を借ります。

Pythonなら標準モジュールを使って、たった2行でCIDR表記にしてくれます。


> python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ipaddress import IPv4Interface
>>> str(IPv4Interface('192.168.1.10/255.255.254.0').with_prefixlen)
'192.168.1.10/23'
>>>

Pythonは人類の宝ですね。(大真面目)

コメント

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