Eu recorri a analisar as strings que são gravadas em HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules
pela extensão de firewall de política de grupo. É assim que os dados brutos do valor do registro podem parecer para uma regra específica:
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|
Como esses são Name=Value
pares de dados em que "Nome" não é único, há mais trabalho do que apenas uma série de Split()
chamadas, mas ainda é suficientemente limpo para funcionar no PowerShell v2 e em diante:
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
}
A saída é uma lista de hashtabs em que os nomes de chaves foram derivados dos respectivos nomes de campos de registro e os valores são strings ou matrizes de strings:
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}
O esquema de nomenclatura é diferente do que (New-object –comObject HNetCfg.FwPolicy2).rules
está retornando e a estrutura parece ser ligeiramente diferente (e provavelmente sujeita a mudanças em versões futuras do Windows) também, mas parece servir ao seu propósito por enquanto.