如何通过命令提示符创建 Windows 2008 高级防火墙规则组定义

fro*_*r78 12 scripting windows firewall command-line-interface

有没有办法在 Windows 高级防火墙中的规则中创建组或添加到现有组(最好通过命令提示符或 WSH 脚本)。

编辑:

在此处输入图片说明

Ric*_*llo 6

Windows 防火墙中的规则可以捆绑在一起并作为一个组激活或停用。

使用netsh advfirewall命令,您可以向防火墙添加规则。使用开关group=来管理 AdvFirewall 组。

使用这样的东西:

netsh advfirewall firewall set rule profile=domain group="Remote Desktop" new enable=Yes
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。但是,这告诉我如何更改现有组。我想知道如何添加组或将我的规则之一放入现有组中。 (2认同)

小智 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)

请参阅这篇文章以了解更多详细信息...


Stu*_*rde 4

找到了这个困扰我很长时间的老问题的解决方案!

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 防火墙命令的语法。