web-dev-qa-db-ja.com

コマンドプロンプトからWindows2008 AdvancedFirewallルールグループ定義を作成する方法

Windows Advanced Firewallのルールにグループを作成する方法、または既存のグループに追加する方法はありますか(コマンドプロンプトまたはWSHスクリプトを使用することをお勧めします)。

編集:

enter image description here

10
frogstarr78

長い間私を悩ませてきたこの古い質問の解決策を見つけました!

New-NetFirewallRule TechNetの記事では、New-NetFirewallRuleコマンドレットの-Groupパラメーターについて次のように述べています。

[...]このパラメーターは、DisplayGroupパラメーターのソース文字列を指定します。 [...]ルールグループを使用して、ルールを影響度ごとに整理し、バッチルールを変更できます。 Set-NetFirewallRuleコマンドレットを使用して、ルールまたはセットのセットにグループ名が指定されている場合、そのグループ内のすべてのルールまたはセットが同じ変更のセットを受け取ります。このパラメーター値を、ユニバーサルで世界に対応した間接的な@FirewallAPI名で指定することをお勧めします。

:DisplayGroupパラメーターは、オブジェクトの作成時に指定できません。 New-NetFirewallRuleコマンドレット。ただし、ドット表記とSet-NetFirewallRuleコマンドレットを使用して変更できます。

チャンスがあるようですね。これを自分で行う方法を見つけようとしているときに、私は次のことを実行しました。

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

...そして、DisplayGroupプロパティにはGetメソッドしかありませんが、Groupプロパティ(そのRuleGroupエイリアスを含む)にはGetメソッドとSetメソッドの両方があることに注意してください。

PowerShellソリューションは次のとおりです:

@maoizmのおかげで、このソリューションは、同じDisplayNameを持つ1つ以上のルールが存在する場合に機能するようになりました。

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

そして、これは実際にあなたのルールに割り当てられる新しいグループ名を作成します。

netshコマンドにはadd groupコマンドがありません。ここで Netsh AdvFirewall Firewall Commands の構文を参照してください。

4
SturdyErde

Windowsファイアウォールのルールは、まとめてバンドルし、グループとしてアクティブ化または非アクティブ化できます。

netsh advfirewallコマンドファイアウォールにルールを追加できます。スイッチを使用するgroup=AdvFirewallグループを管理します。

次のようなものを使用します。

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

あなたが具体的に言及している間

...コマンドプロンプトを使用

スクリプトを使用することを意味していると思います。 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"

詳細については この記事 を参照してください...

3
Lucas

netshコマンドラインにはこのためのフラグがありません。

上記のPowerShellソリューションの代替として、グループ名はレジストリハイブの一部です。

実際、.wfwファイアウォールのエクスポートは実際には raw 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:末尾に|がないと、値は無視されます。

enter image description here

0
tresf