Назад | Перейти на главную страницу

Оценка свойств правил брандмауэра, созданных GPO, в сценарии

На машине 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), но, похоже, на данный момент она служит своей цели.