[英]How can I speed up powershell to get firewall rules on windows 10?
[英]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.