tech.guitarrapc.cóm

Technical updates

PowerShellでファイアウォールの設定を有効化してみる

Firewallネタ + Windows RTの記事も書いたので、サーバー設定自動化の一例としてFirewall設定をPowerShellで行ってみましょう。

バッチの頃を知っている人にとっては目から鱗の簡単さです。

このためにC#を書くとか言う人がいたら、ちょっと待って欲しいです。 ようは「使いどころ」なわけですよ。その労力はもっと他で使ってくだされ~

Firewallの状態確認

今回は、リモートデスクトップの有効化です。まず設定の有効状態を確認しましょう。

ファイアウォール状態の取得はGet-NetFirewallRuleで行えます。 DisplayNameパラメーターは言語設定に引っ張られで、Englishや日本語で名称が変わります。このため、DisplayNameを利用するのは注意です。

# 英語の例
Get-NetFirewallRule -DisplayName "Remote Desktop*" | Select DisplayName, Enabled
# 日本語の例
Get-NetFirewallRule -DisplayName "リモート*デスクトップ*" | Select DisplayName, Enabled

こんなことでifやswitchを書くのもバカげた話なのでNameを使えばいいでしょう。

Name                    : RemoteDesktop-UserMode-In-UDP
ID                      : RemoteDesktop-UserMode-In-UDP
Group                   : @FirewallAPI.dll,-28752
Platform                : {}
LSM                     : False
DisplayName             : リモート デスクトップ - ユーザー モード (UDP 受信)
Enabled                 : False
Profile                 : Any
Direction               : Inbound
Action                  : Allow
EdgeTraversalPolicy     : Block
PrimaryStatus           : OK
Status                  : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus       : NotApplicable
PolicyStoreSourceType   : Local
Caption                 :
Description             : RDP トラフィックを許可するためのリモート デスクトップ サービスの受信規則です。[UDP 3389]
ElementName             : @FirewallAPI.dll,-28776
InstanceID              : RemoteDesktop-UserMode-In-UDP
CommonName              :
PolicyKeywords          :
PolicyDecisionStrategy  : 2
PolicyRoles             :
ConditionListType       : 3
CreationClassName       : MSFT|FW|FirewallRule|RemoteDesktop-UserMode-In-UDP
ExecutionStrategy       : 2
Mandatory               :
PolicyRuleName          :
Priority                :
RuleUsage               :
SequencedActions        : 3
SystemCreationClassName :
SystemName              :
DisplayGroup            : リモート デスクトップ
LocalOnlyMapping        : False
LooseSourceMapping      : False
Owner                   :
Platforms               : {}
PolicyStoreSource       : PersistentStore
Profiles                : 0
RuleGroup               : @FirewallAPI.dll,-28752
StatusCode              : 65536
PSComputerName          :
CimClass                : root/standardcimv2:MSFT_NetFirewallRule
CimInstanceProperties   : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties     : Microsoft.Management.Infrastructure.CimSystemProperties

Nameなら言語に依存せず表示が一定です。

PS> Get-NetFirewallRule -Name "RemoteDesktop**" | Select DisplayName, Enabled | Format-List
DisplayName : リモート デスクトップ - ユーザー モード (TCP 受信)
Enabled     : False

DisplayName : リモート デスクトップ - ユーザー モード (UDP 受信)
Enabled     : False

Firewallの状態変更

GetがあるならSetもあります。

Set-NetFirewallRule

あとは皆大好きパイプで渡すだけです。

Get-NetFirewallRule -Name "RemoteDesktop**" | Set-NetFirewallRule -enabled true

どうですか、このPipe Orientedなお手軽簡単応用も楽勝な感じ。Functionで値に応じて処理を分ければそれでもう終わりです。 初期でセットする要素があるなら、全部渡せば簡単完了です。