ファイアウォールの情報をGUI風に取得するスクリプト作ったので公開します。
<動作動画>
<目的>
技術のアウトプット目的。
少し触ってみたらできそうに感じたため。
<バージョン>
PowerShellのバージョンは5.1です。
その他のバージョン及びPS Coreでの動作確認はしていません。
<できること、特徴>
・wf.mscで確認できる内容風に情報を出力します。
・結果をInbound,Outboundで分けてtsv形式で出力します。
・デフォルトの出力先はデスクトップです。
・動画内でもやってますが、実行後は$RulesGUILikeという変数に内容が格納されているのでこちらから何か加工も可能です。
・日本語化しない場合は$toJP変数のキーをそのままValueへ持っていくのが手っ取り早いです。
(If you do not want to translate it into Japanese, it is recommended to bring the key of the $ toJP variable to Value as it is.)
<免責事項>
本スクリプトによって生じた損害等の一切の責任を負いかねますのでご了承ください。
また一切の問い合わせには応じかねます。
元々は別のスクリプトに組み込んでいたものを切り出したので、変数名とか修正するの面倒で見づらいところがあります。
-------------------------------------------------------------------------------
#Windows Firewallのルールを取得します。
$OutputDir = "$home\desktop" #Output directory name.
$Rules = Get-NetFirewallRule #Get rules.(wf.msc)
$RulesGUILike = New-Object System.Collections.ArrayList
#各種テーブル
$PropArraySuffix = @(
'Basics',
'App',
'Address',
'Port',
'Security'
)
$PropCommand = @(
{Get-NetFirewallRule},
{Get-NetFirewallApplicationFilter},
{Get-NetFirewallAddressFilter},
{Get-NetFirewallPortFilter},
{Get-NetFirewallSecurityFilter}
)
$PropBasics = @(
'Direction',
'DisplayName',
'DisplayGroup',
'Profile',
'Enabled',
'Action'
)
$PropApp = @(
'Program',
'Package'
)
$PropAddress = @(
'LocalAddress',
'RemoteAddress'
)
$PropPort = @(
'Protocol',
'LocalPort',
'RemotePort'
)
$PropSecurity = @(
'RemoteUser',
'RemoteMachine',
'LocalUser'
)
$toJP = @{
"Direction" = "送信/受信";
"DisplayName" = "名前";
"DisplayGroup" = "グループ";
"Profile" = "プロファイル";
"Enabled" = "有効";
"Action" = "操作";
"Program" = "プログラム";
"Package" = "アプリケーション パッケージ";
"LocalAddress" = "ローカル アドレス";
"RemoteAddress" = "リモート アドレス";
"Protocol" = "プロトコル";
"LocalPort" = "ローカル ポート";
"RemotePort" = "リモート ポート";
"RemoteUser" = "承認されているユーザー";
"RemoteMachine" = "承認されているコンピューター";
"LocalUser" = "承認されたローカル プリンシパル"
}
#準備用のカスタムオブジェクトの作成
$QueryMaster = New-Object System.Collections.ArrayList
for ( $i = 0 ; $i -lt $PropArraySuffix.count ; $i += 1) {
$QueryR = New-Object pscustomobject # Query record
$QueryR | Add-Member -NotePropertyName Name -NotePropertyValue $PropArraySuffix[$i]
$QueryR | Add-Member -MemberType ScriptProperty -Name Command -Value {$PropCommand[$i]}
$QueryR | Add-Member -NotePropertyName Array -NotePropertyValue (Get-Variable -Name "Prop$($PropArraySuffix[$i])")
$QueryMaster.Add( ($QueryR | Select Name,Command,Array ) ) | out-null
}
#取得したルールを別のコマンドに送る。準備で作成したカスタムオブジェクトに格納されているコマンドラインを利用する。
for ( $i = 0 ; $i -lt $rules.count ; $i += 1 ) {
$PropR = New-Object pscustomobject
$n = 0
for ( $ia = 0 ; $ia -lt $Querymaster.count ; $ia += 1 ) {
switch ($null) {
{ $querymaster[$ia].Command.tostring() -eq 'Get-NetFirewallRule'} { $tmp = $Rules[$i] ; break }
default { $tmp = ( $rules[$i] | invoke-command $QueryMaster[$ia].Command ) }
}
New-Variable -Name "r$($ia)" -value $tmp -Force
$n += 1
}
for ( $ib = 0 ; $ib -lt $n ; $ib += 1 ) {
$toForeach = Get-Variable -Name "r$($ib)"
foreach ( $b in $QueryMaster[$ib].Array.Value ) {
$PropR | Add-member -NotePropertyName $toJP."$b" -NotePropertyValue ( $toForeach.value | Select-Object $b ).$b
}
}
$RulesGUILike.Add($PropR) | Out-Null
[System.Console]::Write( (
"{0}:`t{1} / {2} `({3:#0.#0}`%`)`r" -f
"ルール処理の進捗状況",
$i,
$Rules.count,
$([Math]::round($i / $rules.count * 100,2))
)
)
}
$RulesGUILike | sort-object "送信*","名前" | ft * -AutoSize -GroupBy "送信*"
$output = "$OutputDir\Inbound.tsv"
$RulesGUILike | ? {$_."送信/受信" -eq 'Inbound'} | sort-object "名前" | ConvertTo-Csv -Delimiter "`t" | Out-File -Encoding default -FilePath $output
$output = "$OutputDir\Outbound.tsv"
$RulesGUILike | ? {$_."送信/受信" -eq 'Outbound'} | sort-object "名前" | ConvertTo-Csv -Delimiter "`t" | Out-File -Encoding default -FilePath $output
pause
]]>