所以,我有这个脚本:
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
答案 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)