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

Ext*_*Use 4 powershell windows-firewall windows-server-2012

我对 Windows 服务器中防火墙 cmdlet 的文档有点困惑。我正在尝试将远程和本地 ip 的地址列表从一个规则复制到另一个规则。我可以使用

Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
Run Code Online (Sandbox Code Playgroud)

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

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
Run Code Online (Sandbox Code Playgroud)

这显然是错误的,因为我立即收到一条错误消息,说Set-NetFirewallAddressFilter没有参数“Displayname”

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

更新

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

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
Run Code Online (Sandbox Code Playgroud)

这不起作用: Set-NetFirewallRule :地址无效。地址可以指定为 IP 地址、范围或子网。

又卡住了……

Tes*_*ler 5

你需要做的是:

  • 按名称获取原始规则
  • 从中取出地址过滤器
  • 按名称获取新规则
  • 在里面设置地址过滤器

是的,您可以将其中的很多合并为一个单行,但例如我认为这可以做到:

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

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress $sourceIPs.RemoteAddress -LocalAddress $sourceIPs.LocalAddress
Run Code Online (Sandbox Code Playgroud)

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

但在那里我不能使用完整的对象,而只能分别使用本地和远程地址

如果单独需要它们,我看不到任何解决方法。Splatting 可能使之成为可能,但这将需要更多的代码才能有效地获得相同的结果。如果它真的必须是一行(为什么?),您可以同时使用以下内容:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress ($ip = Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress -LocalAddress $ip.LocalAddress
Run Code Online (Sandbox Code Playgroud)

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

Set-NetFirewallAddressFilter -DisplayName "FTP Server (FTP Traffic-In)" | 
Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter
Run Code Online (Sandbox Code Playgroud)
  • 尝试通过 DisplayName设置地址过滤器- 它们没有显示名称,过滤器与 FirewallRules 相关联。
  • Set-命令行开关不经常返回任何输出,但是你管,好像它有
  • 管道假想输出进入Get-原始防火墙规则,这只会​​做一些奇怪的事情。它可能会忽略任何管道输入,或者可能会因此而崩溃。无论哪种方式...
  • 这两个Get-cmdlet 将协同工作以获取地址,但它们只是输出到屏幕,不会更改任何内容。

第二次更新:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress | 
    Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter | ft Remote
Run Code Online (Sandbox Code Playgroud)
  • 是 aSet-在开始并获得 RemoteAddres 参数,然后切换(哎哟!)到管道,管道什么?进入Get-NetFirewallRule(与以前相同的警告)
  • 然后获取规则的地址过滤器,并通过管道传输到Format-Table(!),这是一个仅供交互式控制台使用的显示 cmdlet。

完全正确 - 乍一看,它具有 PowerShell 单线的外观,但它真的很糟糕。

  • 您不倾向于从Set-cmdlet管道输出。
  • 您不能将管道连接到写入参数值的中间
  • 您不应该通过 Format-List 或 Format-Table 发送数据,并计划将输出用作另一个 cmdlet 的输入——它们会很乐意添加空格、制表符、显示名称、丢弃数据,并通常将内容混搭起来在屏幕上看起来不错
  • 您将Get-s 链接在一起但不使用输出。

:连枷:

但它是如此接近,它看起来像:

Set-NetFirewallRule -DisplayName "Test" -RemoteAddress (Get-NetFirewallRule -DisplayName "MSSQL" | Get-NetFirewallAddressFilter).RemoteAddress
Run Code Online (Sandbox Code Playgroud)

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