tech.guitarrapc.cóm

Technical updates

PowerShell で Firewallに設定を追加する

以前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で扱えますね?