Avaliando propriedades de regras de firewall criadas pelo GPO em um script

2

Em uma máquina do Server 2008 R2, eu gostaria de usar o Powershell para consultar a lista de "endereços remotos" para uma regra específica. A regra em questão foi criada por meio de uma política de grupo aplicada à máquina.

Eu sei que há netsh advfirewall firewall show rule name=<name> , bem como a lista retornada por (New-object –comObject HNetCfg.FwPolicy2).rules , mas ambos parecem incluir somente regras que foram definidas localmente e não listam nenhuma das regras criadas pela extensão de GPO do firewall.

Como faço para obter convenientemente as propriedades das regras criadas por políticas?

    
por the-wabbit 16.08.2016 / 16:48

1 resposta

0

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.

    
por 17.08.2016 / 12:46