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

Вопрос или проблема

Мне интересно, сталкивался ли кто-нибудь в Microsoft с ситуацией, когда не может вспомнить имя правила!
Команда netsh advfirewall firewall show rule принимает только 1 имя, и в netsh нет возможности для сопоставления шаблонов, чтобы помочь найти правило с помощью шаблона, такого как "SQL*" или ^SQL.+$.
Используя команду show и 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 вместо этого. К счастью, то, что хотел сделать автор сообщения, легко реализуется в PowerShell:

Get-NetFirewallRule -DisplayName "SQL*"

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

Remove-NetFirewallRule -DisplayName "*mongod.exe"

Вы можете попробовать Select-String:

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 можно встроить в функциональные блоки.

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

(New-Object -ComObject HNetCfg.FwPolicy2).rules |
    Where-Object { $_.Name -match '^SQL.+$' } |
    ForEach-Object { Write-Output "Проверяем $($_.Name)"
      if ( $_.Enabled ) { Write-Output "$($_.Name) уже включен" }
      else { Write-Output "$($_.Name) включен"; $_.Enabled = $true }
    }                                                              

В дополнение к тому, что сказал @Бен десять лет назад (ох), установив Cygwin, вы можете получить довольно много инструментов Unix, готовых к запуску на Windows, включая grep.

Тогда вы можете выполнить следующую команду из любого терминала (только не запускайте её из интерфейса netsh):

netsh advfirewall firewall show rule name=all verbose | grep -i -n -A 9 -B 6 -e "youRegex"

Cygwin очень хорош, но для более нативного Linux-опыта теперь также есть WSL. Если я правильно помню, вам просто нужно будет добавить wsl перед этой командой.

Еще раз спасибо @Бену, который направил меня в правильном направлении, чтобы решить свою собственную проблему, с которой я столкнулся десять лет спустя после него!

Ответ или решение

Для решения вашей задачи по поиску правил брандмауэра на Windows с использованием netsh, можно использовать несколько методов, включая PowerShell и обычные командные строки.

Использование PowerShell

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

  1. Для поиска правил с именем, которое соответствует вашему шаблону, используйте:

    Get-NetFirewallRule -DisplayName "SQL*"
  2. Если вы хотите более сложную логику поиска с регулярными выражениями:

    (New-Object -ComObject HNetCfg.FwPolicy2).rules |
       Where-Object { $_.Name -match '^SQL.+$' } |
       ForEach-Object { Write-Output "Найдено: $($_.Name)" }

Использование netsh и findstr

Если вам необходимо использовать netsh, вы можете перечислить все правила и использовать findstr или find для фильтрации:

  1. Сначала выведите все правила:

    netsh advfirewall firewall show rule name=all
  2. Затем используйте findstr для поиска соответствия шаблону:

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

Использование UNIX-подобных инструментов

Если вам удобнее использовать grep, вы можете установить Cygwin, который предоставляет множество UNIX-подобных утилит на Windows. После установки вы можете выполнить следующую команду:

netsh advfirewall firewall show rule name=all verbose | grep -i -n -A 9 -B 6 -e "yourRegex"

Также вы можете использовать Windows Subsystem for Linux (WSL), что позволяет вам запускать команды Linux непосредственно из Windows.

Резюме

Таким образом, для эффективного поиска правил брандмауэра:

  • Наилучший подход — использовать PowerShell, так как он предоставляет гибкие возможности для фильтрации и комбинирования правил.
  • Если нужно использовать netsh, распечатайте все правила и используйте findstr для простого текстового поиска.
  • Учитывайте возможность использования Cygwin или WSL для более мощного текстового поиска через grep.

Выбор метода будет зависеть от вашего удобства и требований конкретной задачи.

Оцените материал
Добавить комментарий

Капча загружается...