Вопрос или проблема
Мне интересно, сталкивался ли кто-нибудь в 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:
-
Для поиска правил с именем, которое соответствует вашему шаблону, используйте:
Get-NetFirewallRule -DisplayName "SQL*"
-
Если вы хотите более сложную логику поиска с регулярными выражениями:
(New-Object -ComObject HNetCfg.FwPolicy2).rules | Where-Object { $_.Name -match '^SQL.+$' } | ForEach-Object { Write-Output "Найдено: $($_.Name)" }
Использование netsh и findstr
Если вам необходимо использовать netsh
, вы можете перечислить все правила и использовать findstr
или find
для фильтрации:
-
Сначала выведите все правила:
netsh advfirewall firewall show rule name=all
-
Затем используйте
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.
Выбор метода будет зависеть от вашего удобства и требований конкретной задачи.