2016-02-22 52 views
0

我正在嘗試擴展我編寫的腳本(並從用戶那裏獲得幫助)。它是一個Windows PowerShell腳本,可將IP添加到Windows防火牆上的遠程地址列表中。更改Windows防火牆遠程地址的腳本,排除localsubnets的規則

我想讓它排除遠程地址已經指定爲「LocalSubnet」的任何防火牆規則。

這是我到目前爲止,目前當我用write-host而不是實際的命令運行它時,它什麼都不顯示。

#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 
    } 
} 

我迷失在嵌套循環......我甚至需要嵌套循環嗎?我嘗試了一段時間,做循環以及無濟於事。

@Matt - 謝謝!這是正確的腳本。

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

foreach ($rule in $rules) 
    { 

    #Set-NetFirewallRule -DisplayName $r.DisplayName -RemoteAddress $ips 
    write-host $rule.Displayname $ips 

} 
+0

哎呀抓到一個拼寫錯誤,我現在得到輸出。但它看起來只是循環遍歷它們而不管「LocalSubnet」上的NotMatch。 – Nov2009

+0

看起來我正在獲取入站和出站規則修復腳本。認爲它仍然沒有處理嵌套循環。 – Nov2009

+0

因此,您正在更新'$ name'中遠程地址不是LocalSubnet的所有'$ r'? – Matt

回答

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就足夠了。

+0

@Matt - 你的更新是有效的,我會稍微注意一下where-object命令。我將發佈上面的更新腳本。 – Nov2009

+0

@FrodeF。酷豆。我從來沒有玩過PS5 cmdlet。 – Matt

+0

@FrodeF。看起來他們在不同的場合。 https://technet.microsoft.com/en-us/library/jj554860(v=wps.630).aspx – Matt

相關問題