在Server 2008 R2机器上,我想使用Powershell来查询特定规则的“远程地址”列表。 有关的规则是通过适用于机器的组策略创build的。
我知道有netsh advfirewall firewall show rule name=<name>以及由(New-object –comObject HNetCfg.FwPolicy2).rules返回的列表,但两者似乎只包括已经在本地定义的规则,不列出由防火墙GPO扩展创build的任何规则。
如何方便地获取策略创build规则的属性?
我使用组策略防火墙扩展来parsing写入HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules的string。 这是原始的registry值数据可能看起来像一个特定的规则:
v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|LPort=5666|RA4=192.168.21.55|RA4=192.168240.10|RA4=192.168.240.11|RA4=192.168.240.12|App=%ProgramFiles%\NSClient++\nscp.exe|Name=NSClient++ Monitoring Agent|Desc=Allow NSClient/NRPE connections from Nagios servers|
由于这些是“名称”不是唯一的“ Name=Value ”数据对,因此除了一系列Split()调用之外,还有更多的工作,但仍然足够干净,可以在PowerShell v2及更高版本中使用:
Function Get-GPOFirewallRules() { $regPath="HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules" # fetch rule value strings from registry into an array of strings, # map version info and GPO rule ID into fields in string $rulesRaw = (Get-ItemProperty -Path $regPath).PSObject.Properties | ` Where-Object { $_.Name -like "{[0-9A-F\-]*}" } | ` Select-Object "Name", "Value" | ` ForEach-Object { $_.Value -replace "^(v[0-9\.]*)\|", ` "GPOID=$($_.Name)|GPOVERSION=`$1|" } # construct a result set of hashtables $rulesRaw | ForEach-Object { $rule=@{} # initialize as hashtable $_.Split("|") | ForEach-Object { $name = $_.Split("=")[0] $value = $_.Split("=")[1] # for multi-valued names, cast to array and add value element If ($rule.ContainsKey($name)) { $rule.$name = [array]($rule.$name) + $value } Else { $rule.Add($name, $value) } } # $_.Split("|") | ForEach-Object $rule } #$rulesRaw | ForEach-Object }
输出是哈希表的列表,其中键名是从相应的registry字段名派生的,值是string或string数组:
Get-GPOFirewallRules Action Allow GPOVERSION v2.10 Dir In Desc Allow NSClient/NRPE connections from Nagios servers Name NSClient++ Monitoring Agent Active TRUE RA4 {192.168.21.55, 192.168.240.10, 192.168.240.11, 192.168.240.12} App %ProgramFiles%\NSClient++\nscp.exe Protocol 6 LPort 5666 GPOID {1FEFA84F-0779-4279-9C02-F5678C949304} Action Allow GPOVERSION v2.10 Dir In Name Allow ICMP for Monitoring und Management Active TRUE RA4 {192.168.21.55, 192.168.3.60, 192.168.3.61, 192.168.8.0/255.255.255.0...} ICMP4 {3:*, 8:*, 11:*} Protocol 1 GPOID {6CA2C52C-6AD6-4513-B197-3702637BD9DF}
命名scheme不同于(New-object –comObject HNetCfg.FwPolicy2).rules正在返回的结构,结构似乎稍有不同(在将来的Windows版本中可能会发生变化),但它似乎可以达到其目的现在。