首页 > 解决方案 > 用powershell添加本地Windows防火墙规则的最干净的方法是什么

问题描述

我编写了以下简单的脚本,它读取一个 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
}

标签: windowspowershellwindows-firewall

解决方案


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到名称的末尾,否则我们按照最初的意图命名它。

好的,那是我的午休时间——如果你有任何后续问题,我会回来检查,并仔细检查我是否有任何拼写错误、草率错误或其他任何错误,只是想我会给你一个关于你能做什么的想法。

编辑:嗯,我回来得比我想象的要早。在第二个哈希表示例中,我在示例 1 中提到的很多改进的可读性实际上都丢失了。也许不仅仅是一个名称检查,但如果您运行多项检查,肯定会如此。它很可能仍然有效,但正如我所说的那样,可读性可能会受到影响。


推荐阅读