如何使用 Powershell 检查现有的防火墙规则

tje*_*gan 5 powershell firewall

所以,我有这个脚本:

function Add-FirewallRule {
   param( 
      $name,
      $tcpPorts,
      $appName = $null,
      $serviceName = $null
   )
    $fw = New-Object -ComObject hnetcfg.fwpolicy2 
    $rule = New-Object -ComObject HNetCfg.FWRule

    $rule.Name = $name
    if ($appName -ne $null) { $rule.ApplicationName = $appName }
    if ($serviceName -ne $null) { $rule.serviceName = $serviceName }
    $rule.Protocol = 6 #NET_FW_IP_PROTOCOL_TCP
    $rule.LocalPorts = $tcpPorts
    $rule.Enabled = $true
    $rule.Grouping = "@firewallapi.dll,-23255"
    $rule.Profiles = 7 # all
    $rule.Action = 1 # NET_FW_ACTION_ALLOW
    $rule.EdgeTraversal = $false
    if(*here*)
    {
    $fw.Rules.Add($rule)
    }

}
Run Code Online (Sandbox Code Playgroud)

并且我希望能够在 if() 中放入一些内容,以便在添加规则之前检查该规则是否已经存在。我对powershell不是很熟悉,所以对我放轻松:P

Chr*_*lls 6

SDL 微服务的 PowerShell 防火墙示例

仅在不存在的情况下创建新的防火墙规则

$rules = Get-NetFirewallRule

$par = @{
    DisplayName = ""
    LocalPort = 80
    Direction="Inbound"
    Protocol ="TCP" 
    Action = "Allow"
}

$par.LocalPort = 8081
$par.DisplayName = "SDL Web 8 Stage Content Microservice on port $($par.LocalPort)"
if (-not $rules.DisplayName.Contains($par.DisplayName)) {New-NetFirewallRule @par}

$par.LocalPort = 8082
$par.DisplayName = "SDL Web 8 Stage Discovery Microservice on port $($par.LocalPort)"
if (-not $rules.DisplayName.Contains($par.DisplayName)) {New-NetFirewallRule @par"}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ius 5

为什么不只是:

$r = Get-NetFirewallRule -DisplayName 'Docker Cluster Management Communications' 2> $null; 
if ($r) { 
    write-host "found it"; 
} 
else { 
    write-host "did not find it" 
}
Run Code Online (Sandbox Code Playgroud)


小智 4

MSDN 在此处提供了一些有关 Windows 防火墙 API 的详细文档:

http://msdn.microsoft.com/en-us/library/aa366449(v=vs.85).aspx

您需要从实例化 HNetCfg.FwMgr COM 对象开始——这将使您能够通过 HNetCfg.FwMgr.LocalPolicy.CurrentProfile 查询各种现有规则。

有几种不同类型的规则:授权应用程序、全局开放端口、ICMP 设置和“服务”。INetFwProfile 对象(通过 CurrentProfile 检索)具有允许访问这些规则的属性。

http://msdn.microsoft.com/en-us/library/aa365327(v=vs.85).aspx

更新 (2014-01-30):在 Windows 8 和 Windows Server 2012 中,有一个名为 的 PowerShell 模块NetSecurity,其中包含该Get-NetFirewallRule命令。您可以使用此命令来发现已定义哪些防火墙规则。要添加新的防火墙规则,请使用New-NetFirewallRule同一NetSecurity模块中的命令。