tech.guitarrapc.cóm

Technical updates

PowerShellでWindows 8やWindows Server 2012のFirewall状態を取得する

Windows Server 2012いいですね。 最新のWindowsを触れる環境というのは幸せです。 さて、Windows Server 2012やWindows 8では、PowerShell 3.0でローカル、リモートのファイアウォール状態を取得可能です。 今回はその手法例を紹介します。

Firewall状態を取得するコマンドレット

簡単です。
Get-NetFirewallRule

取得できるメンバー

では取得できるメンバーはなんでしょうか? 見てみましょう。
Get-NetFirewallRule | Get-Member
   TypeName: Microsoft.Management.Infrastructure.CimInstance#root/standardcimv2/MSFT_NetFirewallRule

Name                      MemberType     Definition
----                      ----------     ----------
Group                     AliasProperty  Group = RuleGroup
ID                        AliasProperty  ID = Name
LSM                       AliasProperty  LSM = LooseSourceMapping
Name                      AliasProperty  Name = InstanceID
Platform                  AliasProperty  Platform = Platforms
Clone                     Method         System.Object ICloneable.Clone()
Dispose                   Method         void Dispose(), void IDisposable.Dispose()
Equals                    Method         bool Equals(System.Object obj)
GetCimSessionComputerName Method         string GetCimSessionComputerName()
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()
GetHashCode               Method         int GetHashCode()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContex...
GetType                   Method         type GetType()
ToString                  Method         string ToString()
Caption                   Property       string Caption {get;}
CommonName                Property       string CommonName {get;}
ConditionListType         Property       uint16 ConditionListType {get;}
CreationClassName         Property       string CreationClassName {get;}
Description               Property       string Description {get;set;}
DisplayGroup              Property       string DisplayGroup {get;}
ElementName               Property       string ElementName {get;set;}
ExecutionStrategy         Property       uint16 ExecutionStrategy {get;}
InstanceID                Property       string InstanceID {get;}
LocalOnlyMapping          Property       bool LocalOnlyMapping {get;set;}
LooseSourceMapping        Property       bool LooseSourceMapping {get;set;}
Mandatory                 Property       bool Mandatory {get;}
Owner                     Property       string Owner {get;set;}
Platforms                 Property       string[] Platforms {get;set;}
PolicyDecisionStrategy    Property       uint16 PolicyDecisionStrategy {get;}
PolicyKeywords            Property       string[] PolicyKeywords {get;}
PolicyRoles               Property       string[] PolicyRoles {get;}
PolicyRuleName            Property       string PolicyRuleName {get;}
PolicyStoreSource         Property       string PolicyStoreSource {get;set;}
Priority                  Property       uint16 Priority {get;}
Profiles                  Property       uint16 Profiles {get;set;}
PSComputerName            Property       string PSComputerName {get;}
RuleGroup                 Property       string RuleGroup {get;set;}
RuleUsage                 Property       string RuleUsage {get;}
SequencedActions          Property       uint16 SequencedActions {get;}
StatusCode                Property       uint32 StatusCode {get;set;}
SystemCreationClassName   Property       string SystemCreationClassName {get;}
SystemName                Property       string SystemName {get;}
Action                    ScriptProperty System.Object Action {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Action]($this.PSBase.CimIns...
Direction                 ScriptProperty System.Object Direction {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Direction]($this.PSBase....
DisplayName               ScriptProperty System.Object DisplayName {get=$this.PSBase.CimInstanceProperties["DisplayName"].Value;set=param($x) ; $this.PSBase....
EdgeTraversalPolicy       ScriptProperty System.Object EdgeTraversalPolicy {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.EdgeTraversal]...
Enabled                   ScriptProperty System.Object Enabled {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Enabled]($this.PSBase.CimI...
EnforcementStatus         ScriptProperty System.Object EnforcementStatus {get=[Microsoft.Windows.Firewall.Commands.Formatting.Formatter]::FormatEnforcementSt...
PolicyStoreSourceType     ScriptProperty System.Object PolicyStoreSourceType {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.PolicyStoreT...
PrimaryStatus             ScriptProperty System.Object PrimaryStatus {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.PrimaryStatus]($this...
Profile                   ScriptProperty System.Object Profile {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Profile]($this.PSBase.CimI...
Status                    ScriptProperty System.Object Status {get=$this.PSBase.CimInstanceProperties["Status"].Value + " (" + ($this.PSBase.CimInstancePrope...
ふむふむ、良くわからない?では一レコードだけ見てみましょう。
Get-NetFirewallRule -All | Select -First 1
出力です。
Name                  : vm-monitoring-icmpv6
DisplayName           : 仮想マシンの監視 (エコー要求 - ICMPv6 受信)
Description           : エコー要求のメッセージは、他のノードに対する ping 要求として送信されます。
DisplayGroup          : 仮想マシンの監視
Group                 : @vmicres.dll,-700
Enabled               : False
Profile               : Any
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local
ふむふむ。これなら、Display Nameがhogehogeと付くものも取得できそうですね。

取得例

例えばこれでSMBに関するDomainとPrivateの受信ルールが取得できます。 つまり、ファイル共有を受け付けるかどうかですね。
Get-NetFirewallRule -DisplayName *SMB* | where {$_.Profile -match "Domain|Private"} | where Direction -eq Inbound | sort Direction | select *
Name                    : FPS-SMB-In-TCP-NoScope
ID                      : FPS-SMB-In-TCP-NoScope
Group                   : @FirewallAPI.dll,-28502
Platform                : {}
LSM                     : False
DisplayName             : ファイルとプリンターの共有 (SMB 受信)
Enabled                 : False
Profile                 : Domain
Direction               : Inbound
Action                  : Allow
EdgeTraversalPolicy     : Block
PrimaryStatus           : OK
Status                  : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus       : NotApplicable
PolicyStoreSourceType   : Local
Caption                 :
Description             : サーバー メッセージ ブロックの名前付きパイプ経由の送受信を許可するためのファイルとプリンターの共有の受信規則です。 [TCP 445]
ElementName             : @FirewallAPI.dll,-28511
InstanceID              : FPS-SMB-In-TCP-NoScope
CommonName              :
PolicyKeywords          :
PolicyDecisionStrategy  : 2
PolicyRoles             :
ConditionListType       : 3
CreationClassName       : MSFT|FW|FirewallRule|FPS-SMB-In-TCP-NoScope
ExecutionStrategy       : 2
Mandatory               :
PolicyRuleName          :
Priority                :
RuleUsage               :
SequencedActions        : 3
SystemCreationClassName :
SystemName              :
DisplayGroup            : ファイルとプリンターの共有
LocalOnlyMapping        : False
LooseSourceMapping      : False
Owner                   :
Platforms               : {}
PolicyStoreSource       : PersistentStore
Profiles                : 1
RuleGroup               : @FirewallAPI.dll,-28502
StatusCode              : 65536
PSComputerName          :
CimClass                : root/standardcimv2:MSFT_NetFirewallRule
CimInstanceProperties   : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties     : Microsoft.Management.Infrastructure.CimSystemProperties

Name                    : {79B75FCF-5F1B-4A67-A6BF-83B21522CEF8}
ID                      : {79B75FCF-5F1B-4A67-A6BF-83B21522CEF8}
Group                   : @FirewallAPI.dll,-28502
Platform                : {}
LSM                     : False
DisplayName             : ファイルとプリンターの共有 (SMB 受信)
Enabled                 : True
Profile                 : Private
Direction               : Inbound
Action                  : Allow
EdgeTraversalPolicy     : Block
PrimaryStatus           : OK
Status                  : 規則は、ストアから正常に解析されました。 (65536)
EnforcementStatus       : NotApplicable
PolicyStoreSourceType   : Local
Caption                 :
Description             : サーバー メッセージ ブロックの名前付きパイプ経由の送受信を許可するためのファイルとプリンターの共有の受信規則です。 [TCP 445]
ElementName             : @FirewallAPI.dll,-28511
InstanceID              : {79B75FCF-5F1B-4A67-A6BF-83B21522CEF8}
CommonName              :
PolicyKeywords          :
PolicyDecisionStrategy  : 2
PolicyRoles             :
ConditionListType       : 3
CreationClassName       : MSFT|FW|FirewallRule|{79B75FCF-5F1B-4A67-A6BF-83B21522CEF8}
ExecutionStrategy       : 2
Mandatory               :
PolicyRuleName          :
Priority                :
RuleUsage               :
SequencedActions        : 3
SystemCreationClassName :
SystemName              :
DisplayGroup            : ファイルとプリンターの共有
LocalOnlyMapping        : False
LooseSourceMapping      : False
Owner                   :
Platforms               : {}
PolicyStoreSource       : PersistentStore
Profiles                : 2
RuleGroup               : @FirewallAPI.dll,-28502
StatusCode              : 65536
PSComputerName          :
CimClass                : root/standardcimv2:MSFT_NetFirewallRule
CimInstanceProperties   : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties     : Microsoft.Management.Infrastructure.CimSystemProperties
もう少し見やすくしてみましょう。
Get-NetFirewallRule -DisplayName *SMB* `
    | where {$_.Profile -match "Domain|Private"} `
    | where Direction -eq Inbound `
    | sort Direction `
    | select Direction, Enabled, Profile, Action, DisplayName, Description, DisplayGroup, PrimaryStatus, PolicyStoreSourceType
どうでしょうか。
Direction             : Inbound
Enabled               : False
Profile               : Domain
Action                : Allow
DisplayName           : ファイルとプリンターの共有 (SMB 受信)
Description           : サーバー メッセージ ブロックの名前付きパイプ経由の送受信を許可するためのファイルとプリンターの共有の受信規則です。 [TCP 445]
DisplayGroup          : ファイルとプリンターの共有
PrimaryStatus         : OK
PolicyStoreSourceType : Local

Direction             : Inbound
Enabled               : True
Profile               : Private
Action                : Allow
DisplayName           : ファイルとプリンターの共有 (SMB 受信)
Description           : サーバー メッセージ ブロックの名前付きパイプ経由の送受信を許可するためのファイルとプリンターの共有の受信規則です。 [TCP 445]
DisplayGroup          : ファイルとプリンターの共有
PrimaryStatus         : OK
PolicyStoreSourceType : Local

有効なものだけ取得したい

こんな感じでどうでしょう。
Get-NetFirewallRule -Enabled True
更にInboundなどなどに絞るならこうでしょうか。 -DisplayNameパラメータと、-Directionパラメーターは共存できないので注意です。
Get-NetFirewallRule -Enabled True -Direction Inbound `
    | where {$_.Profile -match "Domain|Private"} `
    | select Direction, Enabled, Profile, Action, DisplayName, Description, DisplayGroup, PrimaryStatus, PolicyStoreSourceType

リモート先から取得したい

勿論可能です。PowerShell嘗めるな的な感じで楽勝です。 要は、Get-NetFirewallRuleはCIMのオーバーロードなので、CIMsessionを利用します。 ということは、認証をGet-Credentialで取得して、cimsessionを生成し、Get-NetFirewallRuleに渡せば完了です。
$cd = Get-Credential
$cimsession = New-CimSession -ComputerName "Serverhogehoge" -Credential $cd
Get-NetFirewallRule -CimSession $cimsession -Enabled True -Action Allow `
    | where {$_.Profile -match "Domain|Private"} `
    | sort Direction `
    | select Direction, Enabled, Profile, Action, DisplayName, Description, DisplayGroup, PrimaryStatus, PolicyStoreSourceType
簡単ですね。