powershell批量修改远程防火墙规则需先启用winrm服务并开放端口,再通过invoke-command远程执行new-netfirewallrule等命令,支持封禁ip段或更新规则;操作后须验证结果并处理失败节点。
用 powershell 批量修改远程主机的防火墙规则,核心在于“远程执行 + 防火墙命令组合”。这不是简单复制本地命令,而需要打通通信、验证权限、再下发操作。整个过程不复杂但容易忽略前置条件。
确保远程主机已启用 WinRM
PowerShell 远程命令依赖 Windows Remote Management(WinRM)服务。目标机器必须开启并配置正确,否则命令根本发不出去。
- 在每台远程主机上以管理员身份运行:
Enable-PSRemoting -Force - 开放防火墙端口(默认5985 HTTP / 5986 HTTPS):
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -Enabled True - 确认 WinRM 服务已自动启动:
Set-Service -Name WinRM -StartupType Automatic; Start-Service WinRM
准备目标主机列表和执行脚本
把要操作的机器 IP 或主机名存成纯文本文件(如 hosts.txt),每行一个。脚本读取后统一执行相同防火墙操作。
- 例如封禁某 IP 段访问 RDP(3389):
$blockIP = "192.168.100.0/24"
$script = { New-NetFirewallRule -DisplayName "Block-RDP-from-$using:blockIP" -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress $using:blockIP -Action Block -Enabled True } - 批量调用:
$computers = Get-Content "C:\list\hosts.txt"
Invoke-Command -ComputerName $computers -ScriptBlock $script
批量修改已有规则(比如更新 IP 范围)
不能直接“改”规则参数,而是先查、再删、再重建。适合调整 RemoteAddress 或端口等关键字段。
- 查找匹配规则:
Get-NetFirewallRule -DisplayName "Block-RDP-*" | ForEach-Object {
$oldName = $_.DisplayName
Remove-NetFirewallRule -DisplayName $oldName
New-NetFirewallRule -DisplayName $oldName -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress "10.20.30.0/24" -Action Block
} - 这个逻辑封装进远程脚本里,就能一次同步多台机器的规则内容。
验证与错误处理建议
批量操作最怕“看似成功实则部分失败”,建议加基础反馈机制。
- 执行后检查返回结果:
$result = Invoke-Command -ComputerName $computers -ScriptBlock $script
$result | Select PSComputerName, RunspaceId, ErrorRecord - 对失败节点单独重试或记录日志:
$result | Where-Object {$_.ErrorRecord} | Export-Csv "failed_hosts.csv" -NoTypeInformation











