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

Как я могу использовать netsh для поиска правила по шаблону

Мне интересно, попадал ли кто-нибудь в Microsoft когда-либо в ситуацию, когда они не могли вспомнить название правила!
В netsh advfirewall firewall show rule принимает только 1 имя, и в netsh нет возможности сопоставления с образцом, чтобы помочь найти правило с использованием такого образца, как "SQL*" или ^SQL.+$
используя шоу и name=all можно перечислить все правила, но мне не удалось найти надежного инструмента grep для командной строки для Windows.

Я хочу иметь возможность запускать такую ​​команду:

netsh advfirewall firewall show rule name=sql*

Это возможно?

В PowerShell запустите:

$fw=New-object -comObject HNetCfg.FwPolicy2    
$fw.rules | findstr /i "whaturlookingfor"

еще лучше:

$fw.rules | select name | select-string "sql"

Это лучшее, что я мог сделать. Кто-нибудь знает, как это сделать? Например, удалить / вычесть имя правила из результатов?

netsh advfirewall firewall show rule name=all | find "Rule Name:" | find "NameLookingFor"

В Windows 10 я получаю предупреждение при выполнении netsh advfirewall, говоря, что будущие версии Windows могут больше не поддерживать эту функцию, и вместо этого следует использовать PowerShell. К счастью, то, что хотел сделать OP, легко в PowerShell:

Get-NetFirewallRule -DisplayName "SQL*"

У меня было более 1000 правил брандмауэра, которые были созданы исполняемым файлом со случайным именем, который я хотел удалить. Следующая команда упростила это:

Remove-NetFirewallRule -DisplayName "*mongod.exe"

Можешь попробовать Выбрать строку:

netsh advfirewall firewall show rule name=all | select-string -pattern "Hyper-V"

Без PowerShell вы можете просто использовать регулярное выражение с findstr:

netsh advfirewall firewall show rule name=all | findstr /R "sql.*"

По общему признанию, это грубый ответ, но комментарий затемнит суть.

По общему признанию, это также отвечает на несколько другой вопрос: как я могу не использовать netsh и все еще находишь правила? :-)

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

Ради этого я включил некоторые условные выражения и изменения, чтобы показать, как все конструкции PowerShell могут быть встроены в блоки функционального стиля.

Последнее предостережение, что мутации должны выполняться с правами администратора там, где as reads не требуется.

(New-Object -ComObject HNetCfg.FwPolicy2).rules |
    Where-Object { $_.Name -match '^SQL.+$' } |
    ForEach-Object { Write-Output "Checking $($_.Name)"
      if ( $_.Enabled ) { Write-Output "$($_.Name) already enabled" }
      else { Write-Output "$($_.Name) enabled"; $_.Enabled = $true }
    }