Get-NetFirewallRule очень медленный - PullRequest
2 голосов
/ 06 февраля 2020

Метод Get-NetFirewallRule проверяет состояние в течение примерно половины секунды. Это очень долгое время, когда мне нужно проверить более ста имен в брандмауэре.

# About a minute checked this

0..100 | % { Get-NetFirewallRule -DisplayName $_ }

Можно ли ускорить этот метод? Спасибо

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Сначала быстрее получить все правила. Затем запросите полученные правила на основе ваших критериев.

# Storing Rules in Variable First
$rules = Get-NetFirewallRule
$rules | Where DisplayName -in 0..100

# Using the pipeline only 
Get-NetFirewallRule | Where DisplayName -in 0..100

Тест производительности:

# One Rule At a Time
Measure-Command {0..10 |% { get-netfirewallrule -displayname $_ }}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 9
Milliseconds      : 877
Ticks             : 98770423
TotalDays         : 0.000114317619212963
TotalHours        : 0.00274362286111111
TotalMinutes      : 0.164617371666667
TotalSeconds      : 9.8770423
TotalMilliseconds : 9877.0423

# Get All Rules First
Measure-Command {$rules = Get-netfirewallrule; $rules | where displayname -in 0..10}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 44
Ticks             : 10440671
TotalDays         : 1.20841099537037E-05
TotalHours        : 0.000290018638888889
TotalMinutes      : 0.0174011183333333
TotalSeconds      : 1.0440671
TotalMilliseconds : 1044.0671
1 голос
/ 06 февраля 2020

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

Get-WmiObject MSFT_NetFirewallRule -Namespace Root\StandardCimv2 -filter 'creationclassname="MSFT|FW|FirewallRule|vm-monitoring-dcom"'

Правила межсетевого экрана хранятся в реестре, кстати.

Существуют различные команды фильтра get-netfirewall *, которые ускоряют доступ к определенной информации, но не к имени или отображаемому имени.

Вы можете попробовать создать собственную хэш-таблицу отображаемых имен.

0 голосов
/ 06 февраля 2020

Попробуйте поставить это на работу, это станет намного быстрее:

$job = Start-Job -ScriptBlock {
  0..100 | % { Get-NetFirewallRule -DisplayName $_ }
}
$job | Wait-Job | Receive-Job
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...