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

时间:2011-07-06 14:21:36

标签: 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)
    }

}

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

8 个答案:

答案 0 :(得分:3)

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中,有一个名为NetSecurity的PowerShell模块,其中包含Get-NetFirewallRule命令。您可以使用此命令来发现已定义的防火墙规则。要添加新的防火墙规则,请在同一New-NetFirewallRule模块中使用NetSecurity命令。

答案 1 :(得分:3)

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"}

答案 2 :(得分:2)

为什么不呢:

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

答案 3 :(得分:1)

This answer over on serverfault基于this blog-post,可能有所帮助:

Function Get-EnabledRules
{
    Param($profile)
    $rules = (New-Object -comObject HNetCfg.FwPolicy2).rules
    $rules = $rules | where-object {$_.Enabled -eq $true}
    $rules = $rules | where-object {$_.Profiles -bAND $profile}
    $rules
}

$networkListManager = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]"{DCB00C01-570F-4A9B-8D69-199FDBA5723B}"))
 $connections = $networkListManager.GetNetworkConnections()
[int[] ] $connTypes = @()
$connTypes = ($connections | % {$_.GetNetwork().GetCategory()})
#$connTypes += 1
Write-Host $connTypes

$connTypes | ForEach-Object {Get-EnabledRules -profile $_ | sort localports,Protocol | format-table -wrap -autosize -property Name, @{Label="Action"; expression={$_.action}}, @{Label="Protocol"; expression={$_.protocol}}, localPorts,applicationname}

您需要检查“if()”..

中启用的规则

答案 4 :(得分:0)

跟进@Trevor Sullivian这里的建议是使用NetSecurity模块实现相同的测试脚本。

Import-Module NetSecurity
new-netfirewallrule -Action Allow -Direction Inbound -Enabled True -Protocol TCP                                   -LocalPort <<Port>> -DisplayName <<Name>>

答案 5 :(得分:0)

如何列出整个规则集,包括所有源和目标地址和端口以及协议?这些不包含在Get-NetFirewallRule的默认输出中......(为什么???)

上面的解决方案看起来会这样做,但我不想写一个函数。我正在寻找一种“单线”解决方案。

答案 6 :(得分:0)

你可以用hacky方式做到这一点,所以使用Get-NetFirewallRule并将它包含在try catch语句中。如果规则不存在,它会将我们移到catch语句中,这样我们就可以在那里创建一个新规则。

try {
    $firewallRule = Get-NetFirewallRule -DisplayName PROGRAM -ErrorAction Stop
    "Firewall rule already exist for program.exe" | Add-Content 'file.log'
}
catch {
    if(-Not $firewallRule) {
        New-NetFirewallRule -Program $ecfClient -Action Allow -Profile Any -DisplayName "PROGRAM"
        "Firewall rule for ecfClient.exe succesffully created" | Add-Content 'file.log'
    }
}

您还可以检查Get-NetFirewallRule中的值,如果规则存在,它将返回true,因为变量不是空的。

我知道这样做是一种肮脏的方式,但当我寻找真正帮助我的最短路时。

答案 7 :(得分:0)

这似乎并不广为人知。您可以通过首先访问过滤器命令来快速搜索防火墙规则,例如,列出以“ chrome.exe”作为程序的那些命令。您可以将通配符与-Program一起使用,即使它似乎没有记录。

Get-NetFirewallApplicationFilter -Program *chrome.exe | Get-NetFirewallRule | 
  % Displayname

Google Chrome (mDNS-In)
Get-NetFirewallPortFilter | Where Localport -match 3389 | Get-NetFirewallRule | 
  % Displayname

Remote Desktop - User Mode (TCP-In)
Remote Desktop - User Mode (UDP-In)