@Drovosek01

Как в Powershell быстро определить заблокирован ли .exe с помощью Windows Firewall?

Есть задача - заблокировать .exe полный доступ в сеть с помощью стандартного Windows Firewall.
на Powershell это делается просто:
[void](New-NetFirewallRule -DisplayName "Blocked $exePath" -Direction Inbound -Program $exePath -Action Block -Profile Any)
[void](New-NetFirewallRule -DisplayName "Blocked $exePath" -Direction Outbound -Program $exePath -Action Block -Profile Any)

НО
чтобы не плодить/дублировать правила блокировки - я сначала хочу проверить есть ли для данного $exePath какое-либо правило в Firewall. Если для него нет правил в Firewall то однозначно делаем то, что задумывали - блокируем доступ .exe

Я нашел только 1 способ проверить заблокирован ли для .exe доступ в сеть в Firewall:
Get-NetFirewallRule | Where-Object { $_ } | Get-NetFirewallApplicationFilter | Where-Object { $_.Program -eq "$exePath" }


Проблема в том, что этот поиск (точнее, если я правильно понимаю, перебор всех правил Windows Firewall) выполняется оооооочень долго.
Если необходимо будет проверить несколько .exe на наличие среди правил в Windows Firewall - то это будет катастрофически долго.

Вопросы:
1. Почему эта проверка длится очень долго?
2. Как ускорить эту проверку?
  • Вопрос задан
  • 440 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
медленно, ну потому что медленно :)

Для доступа к правилам оно использует всякие DCOM интерфейсы, что небыстро по определению
Вон как там всё непросто

Для ускорения можно попробовать в обратную сторону

Get-NetFirewallApplicationFilter | Where-Object { $_.Program -eq $exePath } | Get-NetFirewallRule


Причём мой вариант будет правильнее. потому что он на выходе получает не ApplicationFilter, а правило, которое можно проверить. Может оно вообще разрешающее, а не запрещающее и его надо менять/удалять.

А проверка нескольких exe должна делаться не через цикл, как может показаться на первый взгляд, а через массив

$progs = 'exe1.exe', 'exe2.exe'
Get-NetFirewallApplicationFilter | Where-Object { $_.Program -in $progs } | Get-NetFirewallRule


P.S. А вот от такого вообще надо избавляться
| Where-Object { $_ }
Это бессмысленный код в данном контексте
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы