什么是使用Powershell添加本地Windows防火墙规则的最干净方法

时间:2019-10-22 10:22:55

标签: windows powershell windows-firewall

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

1 个答案:

答案 0 :(得分:0)

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中提到的相当一部分可读性实际上丢失了。也许不仅要进行一次名称检查,而且如果要进行多次检查,当然可以。它很可能仍会工作,但是-正如我所说-可读性可能会受到影响。