繁体   English   中英

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

[英]How can you check for existing firewall rules using Powershell

所以,我有这个脚本:

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 不是很熟悉,所以 go 对我来说很容易:P

PowerShell SDL 微服务的防火墙示例

仅在新防火墙规则不存在时才创建它

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

MSDN 有一些关于 Windows 防火墙 API 的大量文档:

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

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

有几种不同类型的规则:授权应用程序、全局开放端口、ICMP 设置和“服务”。 INetFwProfile object(通过 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命令。 您可以使用此命令来发现已经定义了哪些防火墙规则。 要添加新的防火墙规则,请在同一NetSecurity模块中使用New-NetFirewallRule命令。

为什么不只是:

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

这个基于此 blog-post在 serverfault 上的答案可能会有所帮助:

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()”中启用的规则。

您可以以 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,因为变量不为空。

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

在这里跟进@Trevor Sullivian Suggestion 是测试脚本,它使用 NetSecurity Module 实现了相同的功能。

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

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

上面的解决方案看起来可以做到这一点,但我不想写一个 function。 我正在寻找“单线”解决方案。

这似乎并不广为人知。 您可以通过首先转到过滤器命令来快速搜索防火墙规则,例如,列出以“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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM