PowerShell! PowerShell! PowerShell!

PowerShell...システム管理者でスクリプトを書かれる方なら、1度は触れたことがあると思います。
筆者も触りはじめて大分経ちますが、それなりにいろいろなスクリプトを書いてはきました。設定変更を行うもの、設定状態を取得するもの、リモート管理を行うもの、MS-DOSやvbscriptに比べて、本当にいろいろなことができますので、大変管理が楽になった実感があります。

Windows Firewall詳細設定CSVエクスポート

よくあるケースで、Windowsの設定状態をテキストで取得して欲しい、という要望は多いです。様々な情報がテキストで取得できますが、テキストベースの情報取得(たとえばnetsh等)は情報取得に難があり(状況によって出てくる文字列が変わってしまう)ますし、手動でとる(GUIからのテキストファイルによるエクスポート)にはあとで表化するのが難しいので、CSVでとれないか、と聞かれるわけです。どうせなら、自動でとってしまえると、楽ですね。

enum-firewallrule.ps1

$ArrayInbound=@()
$ArrayOutbound=@()

Get-NetFireWallRule|Sort DisplayGroup|Foreach {
	$NFSecF=Get-NetFirewallSecurityFilter -AssociatedNetFirewallRule $_
	$NFAppF=Get-NetFirewallApplicationFilter -AssociatedNetFirewallRule $_
	$NFSerF=Get-NetFirewallServiceFilter -AssociatedNetFirewallRule $_
	$NFAddF=Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_
	$NFPorF=Get-NetFirewallPortFilter -AssociatedNetFirewallRule $_

	$Properties=@{
		"DisplayName"=$_.DisplayName
		"DisplayGroup"=$_.DisplayGroup
		"Profile"=$_.Profile
		"Direction"=$_.Direction
		"Enabled"=$_.Enabled
		"Action"=$_.Action
		"OverrideBlockRules"=$NFSecF.OverrideBlockRules
		"Program"=$NFAppF.Program
		"Service"=$NFSerF.Service
		"LocalAddress"=($NFAddF.LocalAddress -join ";")
		"RemoteAddress"=($NFAddF.RemoteAddress -join ";")
		"Protocol"=$NFPorF.Protocol
		"LocalPort"=$NFPorF.LocalPort
		"RemotePort"=$NFPorF.RemotePort
		"IcmpType"=$NFPorF.IcmpType
		"RemoteUser"=$NFSecF.RemoteUser
		"RemoteComputer"=$NFSecF.RemoteComputer
		"LocalUser"=$NFSecF.LocalUser
		"Owner"=$NFSecF.Owner
		"Package"=$NFAppF.Package
	}

	IF ($_.Direction -eq "Inbound") {
		$ArrayInbound+=(New-Object -typename PSObject -property $Properties|Select @{name="名前";Expression={$_.DisplayName}},`
		@{name="グループ";Expression={$_.DisplayGroup}},@{name="プロファイル";Expression={$_.Profile}},`
		@{name="有効";Expression={$_.Enabled}},@{name="操作";Expression={$_.Action}},`
		@{name="優先";Expression={$_.OverrideBlockRules}},@{name="プログラム";Expression={$_.Program}},`
		@{name="ローカルアドレス";Expression={$_.LocalAddress}},@{name="リモートアドレス";Expression={$_.RemoteAddress}},`
		@{name="プロトコル";Expression={$_.Protocol}},@{name="ローカルポート";Expression={$_.LocalPort}},`
		@{name="リモートポート";Expression={$_.RemotePort}},@{name="承認されているユーザー";Expression={$_.RemoteUser}},`
		@{name="承認されているコンピューター";Expression={$_.RemotePort}},@{name="承認されているローカルプリンシパル";Expression={$_.LocalUser}},`
		@{name="ローカルユーザーオーナー";Expression={$_.Owner}},@{name="アプリケーションパッケージ";Expression={$_.Package}})
		Write-Host $_.DisplayName "(受信の規則) を記録しました。"
	}
	ElseIF ($_.Direction -eq "Outbound") {			
		$ArrayOutbound+=(New-Object -typename PSObject -property $Properties|Select @{name="名前";Expression={$_.DisplayName}},`
		@{name="グループ";Expression={$_.DisplayGroup}},@{name="プロファイル";Expression={$_.Profile}},`
		@{name="有効";Expression={$_.Enabled}},@{name="操作";Expression={$_.Action}},`
		@{name="優先";Expression={$_.OverrideBlockRules}},@{name="プログラム";Expression={$_.Program}},`
		@{name="ローカルアドレス";Expression={$_.LocalAddress}},@{name="リモートアドレス";Expression={$_.RemoteAddress}},`
		@{name="プロトコル";Expression={$_.Protocol}},@{name="ローカルポート";Expression={$_.LocalPort}},`
		@{name="リモートポート";Expression={$_.RemotePort}},@{name="承認されているユーザー";Expression={$_.RemoteUser}},`
		@{name="承認されているコンピューター";Expression={$_.RemotePort}},@{name="承認されているローカルプリンシパル";Expression={$_.LocalUser}},`
		@{name="ローカルユーザーオーナー";Expression={$_.Owner}},@{name="アプリケーションパッケージ";Expression={$_.Package}})
		Write-Host $_.DisplayName "(送信の規則) を記録しました。"
	}
}

$ArrayInbound|Export-CSV Inbound-FirewallRule.csv -NoTypeInformation -encoding Default
$ArrayOutbound|Export-CSV Outbound-FirewallRule.csv -NoTypeInformation -encoding Default
					

このスクリプトですが、[コントロールパネル]-[Windowsファイアウォール]-[詳細設定]-[受信の規則]と[送信の規則]の全ルールをCSVで取得します。これらの情報の一部を取得するスクリプトは結構あると思いますが、全部を取得するスクリプトは、私は見つけられませんでした(だから書いたのですが)。もしすでに存在するようでしたら、お知らせください。

このスクリプトの情報は、実はShow-NetFirewallRuleスクリプトで取得することができます。しかし、Show-FirewallRuleスクリプトは複数のスクリプトの合成スクリプトであり、各プロパティ値を直接取得することができません。従って各プロパティ値がどのコマンドレットから直接には呼び出されるのか、を確認する必要があります。調べたところ結果的にはしたのとおりになっていました。

項目コマンドレットプロパティ
名前Get-NetFireWallRuleDisplayName
グループGet-NetFireWallRuleDisplayGroup
プロファイルGet-NetFireWallRuleProfile
有効Get-NetFireWallRuleEnabled
操作Get-NetFireWallRuleAction
優先Get-NetFirewallSecurityFilterOverrideBlockRules
プログラムGet-NetFirewallApplicationFilterProgram
ローカルアドレスGet-NetFirewallAddressFilterLocalAddress
リモートアドレスGet-NetFirewallAddressFilterRemoteAddress
プロトコルGet-NetFirewallPortFilterProtocol
ローカルポートGet-NetFirewallPortFilterLocalPort
リモートポートGet-NetFirewallPortFilterRemotePort
承認されているユーザーGet-NetFirewallSecurityFilterRemoteUser
承認されているコンピューターGet-NetFirewallSecurityFilterRemoteComputer
承認されているローカルプリンシパルGet-NetFirewallSecurityFilterLocalUser
ローカルユーザーオーナーGet-NetFirewallSecurityFilterOwner
アプリケーションパッケージGet-NetFirewallApplicationFilterPackage

出力されているプロパティが判明したら、あとはGet-NetFireWallRule.Directionによる区別(送信か受信か)を行い、それぞれ配列に入れることでテーブルのできあがりです。あとは、CSV出力すれば問題ありません。ひとまず、お試しあれ。

Modefied at 2015/12/13

戻る