有没有办法创建一个组,或者将现有组添加到 Windows 高级防火墙中的规则中(最好通过命令提示符或 WSH 脚本)。
编辑:
答案1
找到了一个解决这个困扰我很久的老问题的方法!
这新 NetFirewallRuleTechNet 文章对-Group
New-NetFirewallRule 命令行参数进行了如下说明:
[...] 此参数指定 DisplayGroup 参数的源字符串。[...] 规则组可用于按影响组织规则,并允许批量修改规则。使用 Set-NetFirewallRule cmdlet,如果为规则集或集合指定了组名,则该组中的所有规则或集合都会收到相同的修改集。最好使用通用且全球通用的间接 @FirewallAPI 名称来指定此参数值。
笔记:使用 New-NetFirewallRule cmdlet 创建对象时无法指定 DisplayGroup 参数,但可以使用点符号和 Set-NetFirewallRule cmdlet 进行修改。
听起来还真有机会,对吧?在尝试自己找出如何做到这一点时,我运行了以下命令:
Get-NetFirewallRule -DisplayName "Core Networking - IPv6 (IPv6-In)" | Get-Member
...并注意到该DisplayGroup
属性仅有一个 Get 方法,但该Group
属性(及其RuleGroup
别名)同时具有 Get 和 Set 方法。
PowerShell解决方案如下:
感谢@maoizm,当存在一个或多个具有相同 DisplayName 的规则时,此解决方案现在有效:
$RuleName = "NameOfYourFirewallRuleGoesHere"
$RuleGroup = "YourGroupNameGoesHere"
Get-NetFirewallRule -DisplayName $RuleName | ForEach { $_.Group = '$RuleGroup'; Set-NetFirewallRule -InputObject $_ }
这实际上将创建一个分配给您的规则的新组名。
笔记:该netsh
命令没有add group
命令。请参阅语法Netsh AdvFirewall 防火墙命令这里。
答案2
Windows 防火墙中的规则可以捆绑在一起并作为一个组激活或停用。
使用netsh advfirewall
命令可以向防火墙添加规则。使用开关group=
管理 AdvFirewall 组。
使用如下方法:
netsh advfirewall firewall set rule profile=domain group="Remote Desktop" new enable=Yes
答案3
虽然你特别提到
...通过命令提示符
我假设你的意思是使用脚本。使用 2008,你可以使用 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
$fw.Rules.Add($rule)
}
# Sample Usage
Add-FirewallRule "Test port 1234" "1234" $null $null
Add-FirewallRule "Test port 5555-6666" "5555-6666" $null $null
Add-FirewallRule "Test port 2222 Calc" 2222 "c:\windows\system32\calc.exe" $null
Add-FirewallRule "Test port 3333 W3SVC" 3333 $null "W3SVC"
看本文更多详细信息...
答案4
命令netsh
行没有这个标志。
作为上述 PowerShell 解决方案的替代,组名是注册表配置单元的一部分。
事实上,.wfw
防火墙出口实际上是原始regf
注册表配置单元。如果将其导入注册表编辑器,您会看到它是一个以REG_SZ
竖线分隔的值列表。
自定义值位于
HKLM\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
以下是 Google Chrome 防火墙条目的快照(为方便阅读添加了换行符)
{7E29D2BA-3EBF-4AFD-BF6E-BA6486C74660}
v2.10|
Action=Allow|
Active=TRUE|
Dir=In|
Protocol=17|
LPort=5353|
App=C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe|
Name=Google Chrome (mDNS-In)|
Desc=Inbound rule for Google Chrome to allow mDNS traffic.|
EmbedCtxt=Google Chrome|
“组”存储在 下EmbedCtxt
,其值为Google Chrome
。
...因此可以假设您可以使用相同的技术来操纵注册表值...
查找注册表项
reg query HKLM\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules /f "Google Chrome"
- 使用新的或不同的值覆盖注册表项
...|EmbedCtx=My Custom Group|
注释1:由于使用命令提示符附加到现有注册表值,因此故意省略了代码非常棘手。
笔记2:如果没有尾随|
,则该值将被忽略。