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

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

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

编辑:

在此处输入图片描述

答案1

找到了一个解决这个困扰我很久的老问题的方法!

新 NetFirewallRuleTechNet 文章对-GroupNew-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

...因此可以假设您可以使用相同的技术来操纵注册表值...

  1. 查找注册表项

    reg query HKLM\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules /f "Google Chrome"
    
  2. 使用新的或不同的值覆盖注册表项...|EmbedCtx=My Custom Group|

    注释1:由于使用命令提示符附加到现有注册表值,因此故意省略了代码非常棘手

    笔记2:如果没有尾随|,则该值将被忽略。

在此处输入图片描述

相关内容