fro*_*r78 12 scripting windows firewall command-line-interface
有没有办法在 Windows 高级防火墙中的规则中创建组或添加到现有组(最好通过命令提示符或 WSH 脚本)。
编辑:

Windows 防火墙中的规则可以捆绑在一起并作为一个组激活或停用。
使用netsh advfirewall命令,您可以向防火墙添加规则。使用开关group=来管理 AdvFirewall 组。
使用这样的东西:
netsh advfirewall firewall set rule profile=domain group="Remote Desktop" new enable=Yes
Run Code Online (Sandbox Code Playgroud)
小智 5
虽然你特别提到
...通过命令提示符
我会假设你的意思是使用脚本。在 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"
Run Code Online (Sandbox Code Playgroud)
请参阅这篇文章以了解更多详细信息...
找到了这个困扰我很长时间的老问题的解决方案!
New -NetFirewallRule-Group TechNet 文章对New-NetFirewallRule commandlet 的参数进行了如下说明:
[...] 该参数指定 DisplayGroup 参数的源字符串。[...] 规则组可用于按影响力组织规则,并允许批量规则修改。使用 Set-NetFirewallRule cmdlet,如果为一组规则或集指定了组名称,则该组中的所有规则或集都会收到相同的修改集。最好使用通用且通用的间接 @FirewallAPI 名称来指定此参数值。
注意:无法在使用 New-NetFirewallRule cmdlet 创建对象时指定 DisplayGroup 参数,但可以使用点表示法和 Set-NetFirewallRule cmdlet 进行修改。
听起来好像还有机会,对吧?在尝试自己找出如何执行此操作时,我运行了以下命令:
Get-NetFirewallRule -DisplayName "Core Networking - IPv6 (IPv6-In)" | Get-Member
Run Code Online (Sandbox Code Playgroud)
...并注意到该DisplayGroup属性只有一个 Get 方法,但该Group属性(及其RuleGroup别名)同时具有 Get 和 Set 方法。
PowerShell解决方案如下:
感谢@maoizm,现在当存在 1 个或多个具有相同 DisplayName 的规则时,此解决方案可以正常工作:
$RuleName = "NameOfYourFirewallRuleGoesHere"
$RuleGroup = "YourGroupNameGoesHere"
Get-NetFirewallRule -DisplayName $RuleName | ForEach { $_.Group = '$RuleGroup'; Set-NetFirewallRule -InputObject $_ }
Run Code Online (Sandbox Code Playgroud)
这实际上会创建一个分配给您的规则的新组名称。
注意:该netsh命令没有add group命令。请参阅此处Netsh AdvFirewall 防火墙命令的语法。