Странное поведение Get-NetFirewallRule - PullRequest
2 голосов
/ 16 февраля 2020

Я сталкивался с тем, что командлет Get-NetFirewallRule отображает параметры по-разному. Для демонстрации я добавил «123.exe» в брандмауэр (Block Action). Командлет дает такое отображение значений параметров (для компактности пространства я уменьшил некоторые параметры):

$Rules = [HashTable]::Synchronized(@{})
$Rules.Get = (Get-NetFirewallRule).Where({ $_.Action -in 'Block', 4 })
$Rules.Get

------------
DisplayName           : 123
DisplayGroup          : 
Group                 : 
Enabled               : True
Profile               : Domain, Private, Public
Platform              : {}
Direction             : Outbound
Action                : Block
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False

Затем для эксперимента я поместил командлет в другое пространство и получил совершенно другой отображение параметров, которые сейчас не имеют профиля (вместо этого я вижу профили и число 7):

$Rules = [HashTable]::Synchronized(@{})
$RS = [Runspacefactory]::CreateRunspace(); $RS.Open()
$RS.SessionStateProxy.SetVariable('Rules', $Rules)
$PS = [PowerShell]::Create().AddScript({

    $Rules.Get = (Get-NetFirewallRule).Where({ $_.Action -in 'Block', 4 })
})
$PS.Runspace = $RS
$Null = $PS.Invoke()
$Rules.Get

------------
Action                  : 4
Direction               : 2
DisplayGroup            : 
DisplayName             : 123
EdgeTraversalPolicy     : 0
EnforcementStatus       : {0}
LocalOnlyMapping        : False
LooseSourceMapping      : False
Platforms               : {}
PolicyStoreSource       : PersistentStore
PolicyStoreSourceType   : 1
PrimaryStatus           : 1
Profiles                : 7

Ну, я добавил -All. Я снова получил удобное отображение информации:

$Rules = [HashTable]::Synchronized(@{})
$RS = [Runspacefactory]::CreateRunspace(); $RS.Open()
$RS.SessionStateProxy.SetVariable('Rules', $Rules)
$PS = [PowerShell]::Create().AddScript({

    $Rules.Get = (Get-NetFirewallRule -All).Where({ $_.Action -in 'Block', 4 })
})
$PS.Runspace = $RS
$Null = $PS.Invoke()
$Rules.Get

------------
DisplayName           : 123
DisplayGroup          : 
Group                 : 
Enabled               : True
Profile               : Domain, Private, Public
Platform              : {}
Direction             : Outbound
Action                : Block
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False

Я закрыл PowerShell ISE и снова открыл. Я ввел тот же сценарий и получил то, что ожидал. Я снова получил числа в виде значений:

$Rules = [HashTable]::Synchronized(@{})
$RS = [Runspacefactory]::CreateRunspace(); $RS.Open()
$RS.SessionStateProxy.SetVariable('Rules', $Rules)
$PS = [PowerShell]::Create().AddScript({

    $Rules.Get = (Get-NetFirewallRule -All).Where({ $_.Action -in 'Block', 4 })
})
$PS.Runspace = $RS
$Null = $PS.Invoke()
$Rules.Get

------------
Action                  : 4
Direction               : 2
DisplayGroup            : 
DisplayName             : 123
EdgeTraversalPolicy     : 0
EnforcementStatus       : {0}
LocalOnlyMapping        : False
LooseSourceMapping      : False
Platforms               : {}
PolicyStoreSource       : PersistentStore
PolicyStoreSourceType   : 1
PrimaryStatus           : 1
Profiles                : 7

Вопрос: как всегда получить такое отображение параметров?

------------
DisplayName           : 123
DisplayGroup          : 
Group                 : 
Enabled               : True
Profile               : Domain, Private, Public
Platform              : {}
Direction             : Outbound
Action                : Block
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False

Спасибо

1 Ответ

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

если вы измените свой вызов Get-NetFirewallRule для включения Выберите свойства, которые вы ищете, он получит необходимые данные.

Get-NetFirewallRule -All | select DisplayName, DisplayGroup, Group, Enabled, Profile, platform, direction, action, edgetraversalpolicy, looseSourceMapping, localonlymapping

Вы можете передать его на format-table, если вы ищите для представления в виде таблицы или Out-GridView для отображения в виде формы.

$Rules = [HashTable]::Synchronized(@{})
$RS = [Runspacefactory]::CreateRunspace(); $RS.Open()
$RS.SessionStateProxy.SetVariable('Rules', $Rules)
$PS = [PowerShell]::Create().AddScript({

    $Rules.Get = (Get-NetFirewallRule -All | select DisplayName, DisplayGroup, Group, Enabled, Profile, platform, direction, action, edgetraversalpolicy, looseSourceMapping, localonlymapping) | ? { $_.Action -in 'Block', 4 }

})
$PS.Runspace = $RS
$Null = $PS.Invoke()
$Rules.Get
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...