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

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

我对 Windows 服务器中的防火墙命令的文档有点困惑。我试图将远程和本地 IP 地址列表从一个规则复制到另一个规则。我可以使用以下命令获取列表

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 地址、范围或子网。

又卡住了……

答案1

你需要做的是:

  • 根据名称获取原始规则
  • 删除地址过滤器
  • 按名称获取新规则
  • 在其中设置地址过滤器

是的,你可以将其中很多内容合并为一行,但例如我认为这可以做到这一点:

$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

您的两条管道中都有一些真正容易被误解的部分。第一个:

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | 
Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
  • 尝试设置地址筛选按 DisplayName - 它们没有显示名称,过滤器与 FirewallRules 绑定。
  • 命令Set-窗口通常不返回任何输出,但你可以像它有一样进行管道传输
  • 管道虚输出进入Get-原始防火墙规则,这会产生奇怪的效果。它可能会忽略任何管道输入,或者可能因此崩溃。无论哪种方式...
  • 这两个Get-cmdlet 可以协同工作来获取地址,但它们只是输出到屏幕上,不会改变任何内容。

第二次更新:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
  • 一开始是Set-,并且到达 RemoteAddres 参数,但随后切换(哎哟!)到管道,将 ?? 导入管道Get-NetFirewallRule(与前面相同的警告)
  • 然后获取规则的地址过滤器,并通过管道传输到Format-Table(!)这是一个仅供交互式控制台使用的显示 cmdlet。

它几乎是正确的 - 乍一看它就像一个 PowerShell 单行程序,但它实际上真的很坏。

  • 您不倾向于通过管道传输Set-cmdlet 的输出。
  • 无法在写入参数值的过程中连接管道
  • 您不应该通过 Format-List 或 Format-Table 发送数据,并计划将输出用作另一个 cmdlet 的输入 - 他们会很乐意添加空格、制表符、显示名称、丢弃数据,并且通常将所有内容混合在一起以使其在屏幕上看起来很漂亮
  • 您将 链接Get-在一起但不要使用输出。

:连枷:

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

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

Get-将子管道封装在括号中(),以便您可以使用它的输出,获取属性,并将其用作参数.RemoteAddress的值。-RemoteAddressSet-NetFirewallRule

相关内容