什么';使用powershell添加本地windows防火墙规则的最干净方法

什么';使用powershell添加本地windows防火墙规则的最干净方法,windows,powershell,windows-firewall,Windows,Powershell,Windows Firewall,我编写了以下简单的脚本,它读取一个csv文件,然后遍历每个csv文件,并向本地计算机添加一些防火墙规则 我想知道这是否是实现这一目标的“最干净”的方式。(我知道有gpo等),但我正在尝试更多的powershell。我还将尝试添加一个检查规则名称是否已经存在 $rulenames = Import-Csv -Path "C:\temp\newrulenames.csv" ForEach ($name in $rulenames) { New-NetFirewallRule -Displa

我编写了以下简单的脚本,它读取一个csv文件,然后遍历每个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看起来确实是一个不错的选择,但既然你已经意识到了这一点,并且正在尝试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
}
而且,为了运行一些检查(例如,您提到的规则名称),可以在哈希表中立即执行。例如,你可以做这样的事情

$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中提到的许多改进的可读性实际上都丢失了。也许不仅仅是一个名字的检查,但如果你运行多个检查,肯定是这样。它很可能仍然有效,但正如我所说的,可读性可能会受到影响。

谢谢您的快速回复。现在它确实有意义了(飞溅)。我刚刚看了一篇关于MS Docs的文章。我记得我试过,但我想我放弃了,因为这样或那样对我不起作用。在“检查部分”再次感谢您。我需要了解错误/检查,让自己思考哪里可能发生错误,并采取措施。(希望这是有意义的){“$($name.name)-2”}..我的问题是$在这里做什么!你可以把它看作一个动态变量。。。我使用它是为了$name.name的值在字符串中展开,而不是在整个哈希表中展开。{$name.name+“-2”}应该会给出相同的结果。(您可以删除它只是为了比较差异。)