Как проверить существующие правила брандмауэра с помощью Powershell - PullRequest
0 голосов
/ 06 июля 2011

Итак, у меня есть этот сценарий:

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
    if(*here*)
    {
    $fw.Rules.Add($rule)
    }

}

, и я хочу иметь возможность поместить что-то в if (), который проверит и увидит, существует ли правило до его добавления.Я не очень знаком с PowerShell, так что будьте осторожны со мной: P

Ответы [ 7 ]

3 голосов
/ 11 июля 2017

Пример брандмауэра PowerShell для микросервисов SDL

Создать новое правило брандмауэра, только если оно еще не существует

$rules = Get-NetFirewallRule
    $par = @{
    DisplayName = ""
    LocalPort = 80
    Direction="Inbound"
    Protocol ="TCP" 
    Action = "Allow"
}


$par.LocalPort = 8081
$par.DisplayName = "SDL Web 8 Stage Content Microservice on port $($par.LocalPort)"
if (-not $rules.DisplayName.Contains($par.DisplayName)) {New-NetFirewallRule @par}

$par.LocalPort = 8082
$par.DisplayName = "SDL Web 8 Stage Discovery Microservice on port $($par.LocalPort)"
if (-not $rules.DisplayName.Contains($par.DisplayName)) {New-NetFirewallRule @par"}
3 голосов
/ 06 июля 2011

MSDN имеет обширную документацию по API брандмауэра Windows здесь:

http://msdn.microsoft.com/en-us/library/aa366449(v=vs.85).aspx

Начните с создания экземпляра COM-объекта HNetCfg.FwMgr - это даст вам доступ к различным существующим правилам через HNetCfg.FwMgr.LocalPolicy.CurrentProfile.

Существует несколько различных типов правил: авторизованные приложения, глобально открытые порты, настройки ICMP и «службы». Объект INetFwProfile (полученный с помощью CurrentProfile) имеет свойства, которые разрешают доступ к этим правилам.

http://msdn.microsoft.com/en-us/library/aa365327(v=vs.85).aspx

Обновление (2014-01-30) : В Windows 8 и Windows Server 2012 есть модуль PowerShell с именем NetSecurity, который содержит команду Get-NetFirewallRule. Вы можете использовать эту команду, чтобы узнать, какие правила брандмауэра уже определены. Чтобы добавить новое правило брандмауэра, используйте команду New-NetFirewallRule в том же модуле NetSecurity.

2 голосов
/ 18 сентября 2017

Почему бы просто:

$r = Get-NetFirewallRule -DisplayName 'Docker Cluster Management Communications' 2> $null; if ($r) { write-host "found it"; } else { write-host "did not find it" }
1 голос
/ 11 декабря 2012

Этот ответ об ошибке сервера , основанной на этой записи в блоге , может помочь:

Function Get-EnabledRules
{
    Param($profile)
    $rules = (New-Object -comObject HNetCfg.FwPolicy2).rules
    $rules = $rules | where-object {$_.Enabled -eq $true}
    $rules = $rules | where-object {$_.Profiles -bAND $profile}
    $rules
}

$networkListManager = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]"{DCB00C01-570F-4A9B-8D69-199FDBA5723B}"))
 $connections = $networkListManager.GetNetworkConnections()
[int[] ] $connTypes = @()
$connTypes = ($connections | % {$_.GetNetwork().GetCategory()})
#$connTypes += 1
Write-Host $connTypes

$connTypes | ForEach-Object {Get-EnabledRules -profile $_ | sort localports,Protocol | format-table -wrap -autosize -property Name, @{Label="Action"; expression={$_.action}}, @{Label="Protocol"; expression={$_.protocol}}, localPorts,applicationname}

вам нужно проверить включенные правила в вашем 'if ()' ..

0 голосов
/ 11 апреля 2017

Вы можете сделать это хакерским способом, поэтому используйте Get-NetFirewallRule и окружите его оператором try catch.Если правило не существует, оно переместит нас в оператор перехвата, чтобы мы могли создать новое правило там.

try {
    $firewallRule = Get-NetFirewallRule -DisplayName PROGRAM -ErrorAction Stop
    "Firewall rule already exist for program.exe" | Add-Content 'file.log'
}
catch {
    if(-Not $firewallRule) {
        New-NetFirewallRule -Program $ecfClient -Action Allow -Profile Any -DisplayName "PROGRAM"
        "Firewall rule for ecfClient.exe succesffully created" | Add-Content 'file.log'
    }
}

Вы также можете проверить значение из Get-NetFirewallRule, если правило существует, оновернет true, потому что переменная не пустая.

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

0 голосов
/ 16 июля 2016

Как можно составить список всего набора правил, , включая все адреса и порты источника и назначения, а также протоколы? Они не включены в вывод по умолчанию из Get-NetFirewallRule ... (почему ???)

Решение, приведенное выше, выглядит так, как будто это будет сделано, но я не хочу писать функцию. Я ищу решение «с одним вкладышем».

0 голосов
/ 27 марта 2014

Следуя @Trevor Sullivian Предложение, здесь есть тестовый скрипт, который достигает того же с помощью модуля NetSecurity.

Import-Module NetSecurity
new-netfirewallrule -Action Allow -Direction Inbound -Enabled True -Protocol TCP                                   -LocalPort <<Port>> -DisplayName <<Name>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...