使用 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 中提到的相当多的改进的可读性实际上丢失了。可能不会只有一个名称检查,但如果您 运行 多次检查肯定会这样。它很可能仍然有效,但 - 正如我所说 - 可读性可能会受到影响。