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ê ?? emGet-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
.