На машине Server 2008 R2 я хотел бы использовать Powershell для запроса списка «удаленных адресов» для определенного правила. Рассматриваемое правило было создано с помощью групповой политики, применяемой к машине.
Я знаю есть netsh advfirewall firewall show rule name=<name>
а также список, возвращенный (New-object –comObject HNetCfg.FwPolicy2).rules
, но оба, похоже, включают только правила, которые были определены локально, и не перечисляют какие-либо правила, созданные расширением GPO брандмауэра.
Как мне удобно получить доступ к свойствам правил, созданных политикой?
Я прибег к синтаксическому анализу строк, записанных в HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules
расширением брандмауэра групповой политики. Вот как могут выглядеть необработанные данные значения реестра для определенного правила:
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
}
Результатом является список хэш-таблиц, в которых имена ключей были получены из соответствующих имен полей реестра, а значения представляют собой строки или массивы строк:
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}
Схема именования отличается от той, что (New-object –comObject HNetCfg.FwPolicy2).rules
возвращается, и структура кажется немного другой (и, вероятно, может быть изменена в будущих версиях Windows), но, похоже, на данный момент она служит своей цели.