Назад | Перейти на главную страницу

Как создать определение группы правил расширенного брандмауэра Windows 2008 через командную строку

Есть ли способ создать группу или добавить в существующую группу к правилу в расширенном брандмауэре Windows (предпочтительно через командную строку или сценарий WSH).

Редактировать:

Правила в брандмауэре Windows можно объединить и активировать или деактивировать как группу.

С участием netsh advfirewall вы можете добавить правила в брандмауэр. Используйте переключатель group= для управления группами AdvFirewall.

Используйте что-то вроде этого:

netsh advfirewall firewall set rule profile=domain group="Remote Desktop" new enable=Yes

Нашел решение этого старого вопроса, который тоже давно меня беспокоит!

В New-NetFirewallRule В статье TechNet говорится об этом -Group параметр командлета New-NetFirewallRule:

[...] Этот параметр указывает исходную строку для параметра DisplayGroup. [...] Группы правил могут использоваться для организации правил по влиянию и позволяют изменять правила пакетным образом. С помощью командлетов Set-NetFirewallRule, если имя группы указано для набора правил или наборов, все правила или наборы в этой группе получают один и тот же набор изменений. Рекомендуется указывать значение этого параметра с универсальным и всемирно признанным косвенным именем @FirewallAPI.

Заметка: Параметр DisplayGroup нельзя указать при создании объекта с помощью командлета New-NetFirewallRule, но его можно изменить с помощью точечной нотации и командлета Set-NetFirewallRule.

Похоже, есть шанс, правда? Пытаясь узнать, как это сделать сам, я выполнил следующее:

Get-NetFirewallRule -DisplayName "Core Networking - IPv6 (IPv6-In)" | Get-Member

... и отметил, что DisplayGroup свойство имеет только метод Get, но свойство Group собственность (с ее RuleGroup alias) имеет как Get, так и Set.

Решение PowerShell выглядит следующим образом:

Благодаря @maoizm это решение теперь работает, когда существует 1 или несколько правил с одинаковым DisplayName:

$RuleName = "NameOfYourFirewallRuleGoesHere"
$RuleGroup = "YourGroupNameGoesHere"
Get-NetFirewallRule -DisplayName $RuleName | ForEach { $_.Group = '$RuleGroup'; Set-NetFirewallRule -InputObject $_ }

И это фактически создаст новое имя группы, которое будет присвоено вашему правилу.

Заметка: The netsh команда не имеет add group команда. См. Синтаксис для Команды межсетевого экрана Netsh AdvFirewall Вот.

Хотя вы конкретно упоминаете

... через командную строку

Я предполагаю, что вы имеете в виду использование сценария. С 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"

Видеть Эта статья подробнее ...

В 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: Без конечного |, значение будет проигнорировано.