在 powershell 中删除和应用防火墙规则非常慢
Deleting and applying firewall rules in powershell painfully slow
我有几个包含 New-NetFirewallRule
commandlet 的脚本,总共有大约 200 条规则,删除现有规则然后应用新规则大约需要 15 分钟。
根据文档 New-NetFirewallRule
cmdlet 具有 GPOSession
参数,可让您指定 GPO 对象,使用 Open-NetGPO
加载 GPO,您进行修改,然后将 GPO 保存回来。
但是它是无用的参数,因为它看起来只适用于域,我在 Windows 10 台计算机网络上,没有域。
显然每个 New-NetFirewallRule
cmdlet 都是针对本地主机 GPO 独立调用的,这太慢了,有没有办法以某种方式加载本地组策略,做你想做的,然后在不访问 GPO 的情况下应用更改每个防火墙规则?
编辑:
为了回应评论,我认为所有规则都足够简单,即。不处理繁重的呼叫,像这样:(有 200 多个这样的规则)
New-NetFirewallRule -Confirm:$Execute -Whatif:$Debug -ErrorAction $OnError -Platform $Platform `
-DisplayName "Multicast Domain Name System" -Service Dnscache -Program $ServiceHost `
-PolicyStore $PolicyStore -Enabled True -Action Allow -Group $Group -Profile Private, Domain -InterfaceType $Interface `
-Direction $Direction -Protocol UDP -LocalAddress Any -RemoteAddress 224.0.0.251 -LocalPort 5353 -RemotePort 5353 `
-LocalUser Any -LocalOnlyMapping $false -LooseSourceMapping $false `
-Description "In computer networking, the multicast DNS (mDNS) protocol resolves hostnames to IP addresses
within small networks that do not include a local name server."
很多变量是预定义的,但只有少数变量使用更复杂的调用,但这种情况只在脚本初始化期间发生一次。
例如找出环回接口别名:
$Loopback = Get-NetIPInterface | Where-Object {$_.InterfaceAlias -like "*Loopback*" -and $_.AddressFamily -eq "IPv4"} | Select-Object -ExpandProperty InterfaceAlias
要删除规则,我使用此命令删除一组规则:
Remove-NetFirewallRule -PolicyStore $PolicyStore -Group $Group -Direction $Direction -ErrorAction SilentlyContinue
您可以使用 本地安全策略 工具 (secpol.msc
) 进行配置并将其导出到 .inf
文件。然后在目标机器上使用相同的工具导入 .inf
或 secedit.exe
来编写脚本:(如果导出的文件是 mypolicy.inf
)
secedit /configure /db %windir%\security\local.sdb /cfg mypolicy.inf
我有几个包含 New-NetFirewallRule
commandlet 的脚本,总共有大约 200 条规则,删除现有规则然后应用新规则大约需要 15 分钟。
根据文档 New-NetFirewallRule
cmdlet 具有 GPOSession
参数,可让您指定 GPO 对象,使用 Open-NetGPO
加载 GPO,您进行修改,然后将 GPO 保存回来。
但是它是无用的参数,因为它看起来只适用于域,我在 Windows 10 台计算机网络上,没有域。
显然每个 New-NetFirewallRule
cmdlet 都是针对本地主机 GPO 独立调用的,这太慢了,有没有办法以某种方式加载本地组策略,做你想做的,然后在不访问 GPO 的情况下应用更改每个防火墙规则?
编辑: 为了回应评论,我认为所有规则都足够简单,即。不处理繁重的呼叫,像这样:(有 200 多个这样的规则)
New-NetFirewallRule -Confirm:$Execute -Whatif:$Debug -ErrorAction $OnError -Platform $Platform `
-DisplayName "Multicast Domain Name System" -Service Dnscache -Program $ServiceHost `
-PolicyStore $PolicyStore -Enabled True -Action Allow -Group $Group -Profile Private, Domain -InterfaceType $Interface `
-Direction $Direction -Protocol UDP -LocalAddress Any -RemoteAddress 224.0.0.251 -LocalPort 5353 -RemotePort 5353 `
-LocalUser Any -LocalOnlyMapping $false -LooseSourceMapping $false `
-Description "In computer networking, the multicast DNS (mDNS) protocol resolves hostnames to IP addresses
within small networks that do not include a local name server."
很多变量是预定义的,但只有少数变量使用更复杂的调用,但这种情况只在脚本初始化期间发生一次。
例如找出环回接口别名:
$Loopback = Get-NetIPInterface | Where-Object {$_.InterfaceAlias -like "*Loopback*" -and $_.AddressFamily -eq "IPv4"} | Select-Object -ExpandProperty InterfaceAlias
要删除规则,我使用此命令删除一组规则:
Remove-NetFirewallRule -PolicyStore $PolicyStore -Group $Group -Direction $Direction -ErrorAction SilentlyContinue
您可以使用 本地安全策略 工具 (secpol.msc
) 进行配置并将其导出到 .inf
文件。然后在目标机器上使用相同的工具导入 .inf
或 secedit.exe
来编写脚本:(如果导出的文件是 mypolicy.inf
)
secedit /configure /db %windir%\security\local.sdb /cfg mypolicy.inf