使用 powershell 添加本地 windows 防火墙规则的最干净的方法是什么
what's cleanest way in adding local windows firewall rules with powershell
我编写了以下简单脚本,它读取一个 csv 文件,然后遍历每个文件,并将一些防火墙规则添加到本地计算机。
我想知道这是否是 'cleanest' 实现此目标的方法。 (我知道有 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 似乎是真正可行的方式,但由于您已经意识到这一点并正在试用 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
,否则我们按原意命名。
好吧,那是我的午休时间 - 如果您有任何后续问题,我会回来查看,并仔细检查我是否有任何拼写错误、粗心大意的错误或其他任何问题,我想我会让您了解您的想法可以做。
Edit: 嗯,我回来的比我想象的要早。在第二个哈希表示例中,我在示例 1 中提到的相当多的改进的可读性实际上丢失了。可能不会只有一个名称检查,但如果您 运行 多次检查肯定会这样。它很可能仍然有效,但 - 正如我所说 - 可读性可能会受到影响。
我编写了以下简单脚本,它读取一个 csv 文件,然后遍历每个文件,并将一些防火墙规则添加到本地计算机。
我想知道这是否是 'cleanest' 实现此目标的方法。 (我知道有 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 似乎是真正可行的方式,但由于您已经意识到这一点并正在试用 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
,否则我们按原意命名。
好吧,那是我的午休时间 - 如果您有任何后续问题,我会回来查看,并仔细检查我是否有任何拼写错误、粗心大意的错误或其他任何问题,我想我会让您了解您的想法可以做。
Edit: 嗯,我回来的比我想象的要早。在第二个哈希表示例中,我在示例 1 中提到的相当多的改进的可读性实际上丢失了。可能不会只有一个名称检查,但如果您 运行 多次检查肯定会这样。它很可能仍然有效,但 - 正如我所说 - 可读性可能会受到影响。