使用Powershell将Windows Server防火墙地址列表从一个规则复制到另一个规则

我有点卡在Windows服务器的防火墙cmdlet的文档。 我试图从远程和本地ips从一个规则复制到另一个地址列表。 我可以使用列表

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

现在我试图设置这个另一个规则是这样的:

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

这显然是错误的,因为我马上得到一个错误,说Set-NetFirewallAddressFilter没有参数'Displayname'

当我使用Set-NetFirewallRule代替它时,但是我不能使用一个完整的对象,而是单独使用本地和远程地址。 你能帮忙吗?

更新

我现在试着运行这样的东西:

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

这是行不通的:Set-NetFirewallRule:地址是无效的。 地址可以被指定为IP地址,范围或子网。

再次卡住…

你需要做的是:

  • 按名称获取原始规则
  • 从中获取地址filter
  • 按名称获取新规则
  • 在其中设置地址filter

是的,你可以将许多这些合并成一行,但是例如我认为这将做到这一点:

 $sourceRule = Get-NetFirewallRule -DisplayName "MSSQL" $sourceIPs = $sourceRule | Get-NetFirewallAddressFilter Set-NetFirewallRule -DisplayName "Test" -RemoteAddress $sourceIPs.RemoteAddress -LocalAddress $sourceIPs.LocalAddress 

(如果您打开了高级安全GUI的Windows防火墙,请将其刷新)。

但是我不能使用一个完整的对象,而只能使用本地和远程地址

如果需要分开的话,我看不出有什么办法。 Splatting可能会使它成为可能,但这将有更多的代码来实现相同的结果。 如果它真的必须是一行(为什么?),你可以一起做这样的事情:

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

你的两个pipe道都有一些真正的误解。 第一个:

 Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter 
  • 尝试通过DisplayName设置地址filter – 它们没有显示名称,filter绑定到FirewallRules。
  • Set- commandlets通常不会返回任何输出,但是您可以像pipe道一样输出
  • pipe道虚拟输出进入获取原始防火墙规则,这只是做怪事。 它可能会忽略任何pipe道input,或者可能会基于此input而崩溃。 无论哪种方式…
  • 两个Get- cmdlet可以一起工作来获取地址,但是它们只是输出到屏幕上而不会改变任何东西。

第二个更新的:

 Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote 
  • 是一个Set-在开始,并获得远RemoteAddres参数,但然后切换(ouch!)到一个pipe道,pipe什么? 进入Get-NetFirewallRule (与之前相同的警告)
  • 然后获取规则的地址filter,并将其传递到Format-Table (!),它是仅供交互式控制台使用的显示cmdlet。

它几乎是正确的 – 一目了然它看起来像PowerShell一样,但它确实真的坏了。

  • 您不倾向于从Set- cmdletpipe道输出。
  • 您不能将pipe道连接到写入参数值的中间
  • 您不应该通过Format-List或Format-Table发送数据,并计划将输出用作另一个cmdlet的input – 他们将愉快地添加空格,制表符,显示名称,丢弃数据,并且通常将其混合在屏幕上看起来不错
  • 您将Get- s链接在一起,但不要使用输出。

:连枷:

但是它非常接近,它看起来像:

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

Get-子pipe道封装在parens ()以便可以使用它的输出,取得.RemoteAddress属性,并将其用作Set-NetFirewallRule-RemoteAddress参数的值。