更改Windows防火墙远程地址的脚本,不包括使用localsubnets的规则

时间:2016-02-22 16:10:44

标签: powershell

我正在尝试扩展我编写的脚本(并在SO上获得用户的帮助)。它是一个Windows powershell脚本,可将IP添加到Windows防火墙的远程地址列表中。

我试图让它排除任何防火墙规则,其中远程地址已被指定为“LocalSubnet”。

这是我目前所拥有的,目前当我使用write-host而不是实际命令运行它时,它什么也没显示。

reloaddata

我在嵌套循环中丢失了......我甚至需要嵌套循环吗?我尝试了一些,并做循环也无济于事。

@Matt-谢谢!这是正确的脚本。

#This script will update remote address rules with the specified IP scope(s)
$displayname = read-host "Enter firewall rule display name"
$name = Get-NetFirewallRule -DisplayName $displayname |Where-Object {$_.Direction -eq "Inbound"}
$exclusion =  Get-NetFirewallRule -DisplayName $displayname |Get-NetFirewallAddressFilter
$ips = @()
do {
 $input = (Read-Host "Please enter IP address")
 if ($input -ne '') {$ips += $input}
}
until ($input -eq '')

foreach ($r in $name)
{
    foreach ($e in $exclusion){
        if ($e.remoteaddress -NotMatch "LocalSubnet") {continue}
    #Set-NetFirewallRule -DisplayName $r.DisplayName -RemoteAddress $ips
    write-host $r.Displayname $ips
    }
}

1 个答案:

答案 0 :(得分:1)

如果我错了,我会删除它,但评论中的代码很糟糕。我正在更改变量的名称以具有更多含义。您拥有的内部循环不是必需的,会产生额外的输出。我们在这里所做的就是将条件构建到Where-Object中。这将删除您尝试执行的排除逻辑。

$rules = Get-NetFirewallRule -DisplayName $displayname | 
    Where-Object {$_.Direction -eq "Inbound" -and ($_ | Get-NetFirewallAddressFilter).RemoteAddress -ne "LocalSubnet" }

# get ips .....

foreach ($rule in $rules)
{
    # Do Stuff
}

$rules现在应该只是您需要采取行动的那些。

注意:请勿使用$input作为变量名称。它是PowerShell中的保留名称。有关更多信息,请参阅about_automatic_variables。在这种情况下,$answer$result就足够了。

相关问题