以前Firewallについて簡単な記事を書きました。
PowerShellでWindows 8やWindows Server 2012のFirewall状態を取得する
今回は、Firewall に新規設定を追加する方法を紹介します。 ====
実行権限について
管理者権限(UAC) が必要です。
コードサンプル
とりあえず見てみましょう。
if (-not(Get-NetFirewallRule | where Name -eq PowerShellRemoting-In)) { New-NetFirewallRule ` -Name PowerShellRemoting-In ` -DisplayName PowerShellRemoting-In ` -Description "Windows PowerShell Remoting required to open for public connection. not for private network." ` -Group "Windows Remote Management" ` -Enabled True ` -Profile Any ` -Direction Inbound ` -Action Allow ` -EdgeTraversalPolicy Block ` -LooseSourceMapping $False ` -LocalOnlyMapping $False ` -OverrideBlockRules $False ` -Program Any ` -LocalAddress Any ` -RemoteAddress Any ` -Protocol TCP ` -LocalPort 5985 ` -RemotePort Any ` -LocalUser Any ` -RemoteUser Any } else { Write-Verbose "Windows PowerShell Remoting port TCP 5985 was alredy opend. Show Rule" Get-NetFirewallPortFilter -Protocol TCP | where Localport -eq 5985 }
解説
というほどのものでもありません。とりあえず、 Firewall設定を開いてみてください。
Win+R => Firewall.cpl で Firewall 設定を開き、 Advanced Settings (たぶん 詳細設定 に日本語なっていたかと) を開きます。
Inbound Rule (受信ルール)を開くと、分かるはずです。そう、上記のコードは、まんまこの設定を埋めてるだけです。
簡単に説明すると、以下のコマンドレットで現在のルール一覧が取得可能です。
Get-NetFirewallRule
ここで既に同一名称ルールがないか見ています。 (本当はポートとか色々あるんですが、Firewall知ってるひとなら、なぜ名前にとどめたか分かってもらえるかと)
if (-not(Get-NetFirewallRule | where Name -eq PowerShellRemoting-In))
なければルールを追加します。
New-NetFirewallRule ` -Name PowerShellRemoting-In ` -DisplayName PowerShellRemoting-In ` -Description "Windows PowerShell Remoting required to open for public connection. not for private network." ` -Group "Windows Remote Management" ` -Enabled True ` -Profile Any ` -Direction Inbound ` -Action Allow ` -EdgeTraversalPolicy Block ` -LooseSourceMapping $False ` -LocalOnlyMapping $False ` -OverrideBlockRules $False ` -Program Any ` -LocalAddress Any ` -RemoteAddress Any ` -Protocol TCP ` -LocalPort 5985 ` -RemotePort Any ` -LocalUser Any ` -RemoteUser Any
あればその内容を表示
else { Write-Verbose "Windows PowerShell Remoting port TCP 5985 was alredy opend. Show Rule" Get-NetFirewallPortFilter -Protocol TCP | where Localport -eq 5985 }
ルールの削除
Remove-NetFirewallRuleでできますよ。
Remove-NetFirewallRule -Name PowerShellRemoting-In
コードサンプル
基本的には、一個作れば後は同じ要領です。 foreach-Objectで廻してもいいですし、Workflowでサクッと終わらせてもいいでしょう。 これでFirewallもPowerShellで扱えますね?