我对 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
的值。-RemoteAddress
Set-NetFirewallRule