Copie uma lista de endereços do Firewall do Windows Server de uma regra para outra usando o Powershell

4

Estou um pouco preso na documentação dos cmdlets do Firewall no Windows server. Eu estou tentando copiar as listas de endereços para os ips remotos e locais de uma regra para outra. Eu posso pegar a lista usando

Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter

Agora eu estava tentando definir isso para outra regra como esta:

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter

Isso está obviamente errado, pois eu recebo imediatamente um erro dizendo que Set-NetFirewallAddressFilter não tem um parâmetro "Nome da exibição"

Quando eu uso Set-NetFirewallRule em vez disso, mas eu não posso usar um objeto completo, mas apenas endereços locais e remotos separadamente. Você poderia ajudar, por favor?

Atualizar

Eu já tentei executar algo assim:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote

Isso não funciona: Set-NetFirewallRule: O endereço é inválido. Endereços podem ser especificados como endereços IP, intervalos ou sub-redes.

Preso novamente ...

    
por ExternalUse 13.07.2016 / 12:57

1 resposta

5

O que você precisa fazer é:

  • Obtenha a regra original pelo nome
  • Obter o filtro de endereço dele
  • Obter a nova regra pelo nome
  • Defina o filtro de endereço

E sim, você pode mesclar muitos deles em uma linha única, mas, por exemplo, acho que isso será feito:

$sourceRule = Get-NetFirewallRule -DisplayName "MSSQL"
$sourceIPs = $sourceRule | Get-NetFirewallAddressFilter

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress $sourceIPs.RemoteAddress -LocalAddress $sourceIPs.LocalAddress

(e se você tiver a GUI do Firewall do Windows com Segurança Avançada aberta, atualize-a).

but there I cannot use a complete object but only Local and Remote Addresses seperately

Eu não consigo ver nada disso se precisar deles separadamente. Splatting pode tornar isso possível, mas isso seria muito mais código para efetivamente o mesmo resultado. Se realmente tem que ser uma linha (por quê?), Você pode fazer as duas coisas junto com algo como:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress ($ip = Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress -LocalAddress $ip.LocalAddress

Seus dois canais têm alguns bits realmente incompreendidos. O primeiro:

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | 
Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
  • Tenta definir um endereço filtro por DisplayName - eles não têm um nome de exibição, os filtros estão vinculados a FirewallRules.
  • Os Set- commandlets geralmente não retornam nenhuma saída, mas você canaliza como se tivesse
  • A saída imaginária canalizada entra em Get- ing da regra de firewall original, que apenas faz coisas estranhas. Ele pode ignorar qualquer entrada de pipeline ou pode travar com base nele. De qualquer maneira ...
  • Os dois Get- cmdlets trabalhariam juntos para obter endereços, mas apenas exibem na tela e não mudariam nada.

O segundo atualizado:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
  • É um Set- no início e chega até o parâmetro RemoteAddres, mas alterna (ai!) para um pipeline, para canalizar o quê ?? em Get-NetFirewallRule (mesma ressalva de antes)
  • , em seguida, obtém o addressfilter para a regra e canaliza para Format-Table (!), que é um cmdlet de exibição somente para uso do console interativo.

Está quase certo - de relance, ele tem a aparência de uma linha de controle do PowerShell, mas está realmente muito quebrado.

  • Você não costuma direcionar a saída de Set- cmdlets.
  • Você não pode conectar um pipeline no meio da gravação de um valor de parâmetro
  • Você não deve enviar dados por meio de Format-List ou Format-Table e planejar usar a saída como entrada para outro cmdlet - eles adicionarão espaços, guias, exibirão nomes, descartarão dados e, geralmente, misturarão as coisas para ficar bem na tela
  • Você encadeia Get- s juntos, mas não usa a saída.

: flail:

Mas é tão perto que ficaria assim:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress (Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress

Encapsulando o sub-pipeline Get- em parens () para que você possa usar a saída dele, pegando a propriedade .RemoteAddress e usando isso como o valor para o parâmetro -RemoteAddress para Set-NetFirewallRule .

    
por 14.07.2016 / 03:19