![](/img/trans.png)
[英]Changing Windows firewall rules with PowerShell (Open / Close a specific port)
[英]what's cleanest way in adding local windows firewall rules with powershell
我編寫了以下簡單腳本,該腳本讀取 csv 文件,然后遍歷每個文件並將一些防火牆規則添加到本地計算機。
我想知道這是否是實現這一目標的“最干凈”的方式。 (我知道有 gpo 等)但我正在嘗試更多的 powershell。 我還將嘗試添加規則名稱是否已存在的檢查。
$rulenames = Import-Csv -Path "C:\temp\newrulenames.csv"
ForEach ($name in $rulenames) {
New-NetFirewallRule -DisplayName $name.DisplayName -Name $name.Name -Enabled $name.Enabled -Profile $name.Profile -Direction $name.Direction -Action $name.Action -Protocol $name.Protocol -Program $name.Program -EdgeTraversalPolicy $name.EdgeTraversalPolicy
}
GPO 似乎確實是通往 go 的方式,但既然您已經意識到這一點並正在嘗試 PowerShell...
在這種情況下,我個人喜歡使用一種叫做 splatting 的東西(參見 about_Splatting),因為在我看來它可以提高腳本的可讀性。 對於您的特定代碼,它可能看起來像這樣;
$rulenames = Import-Csv -Path "C:\temp\newrulenames.csv"
foreach($name in $rulenames)
{
$ruleProps=@{
DisplayName = $name.DisplayName
Name = $name.Name
Enabled = $name.Enabled
Profile = $name.Profile
Direction = $name.Direction
Action = $name.Action
Protocol = $name.Protocol
Program = $name.Program
EdgeTraversalPolicy = $name.EdgeTraversalPolicy
}
New-NetFirewallRule @ruleProps
}
而且,為了運行一些檢查(例如您提到的規則名稱),這可以立即在哈希表中完成。 例如你可以做這樣的事情;
$ruleProps=@{
DisplayName = $name.DisplayName
Name = if(Get-NetFireWallRule -Name $name.Name -ErrorAction SilentlyContinue) { "$($name.Name)-2" } else { $name.name }
Enabled = $name.Enabled
Profile = $name.Profile
Direction = $name.Direction
Action = $name.Action
Protocol = $name.Protocol
Program = $name.Program
EdgeTraversalPolicy = $name.EdgeTraversalPolicy
}
在這個哈希表示例中,如果我們在該特定規則名稱上得到命中,我們會立即運行檢查。 如果它是一個命中,我們在名稱的末尾添加-2
,否則我們按照最初的意圖命名它。
好的,那是我的午休時間——如果你有任何后續問題,我會回來查看,並仔細檢查我是否有任何拼寫錯誤、草率錯誤或其他任何錯誤,只是想我會給你一個關於你能做什么的想法。
編輯:嗯,我回來得比我想象的要早。 在第二個哈希表示例中,我在示例 1 中提到的很多改進的可讀性實際上都丟失了。 也許不僅僅是一個名稱檢查,但如果您運行多項檢查,肯定會如此。 它很可能仍然有效,但正如我所說的那樣,可讀性可能會受到影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.