Мне нужно перечислить все правила брандмауэра в Windows 10, используя PowerShell. Я переключился на PowerShell с netsh
, потому что некоторые встроенные правила получали смешные имена, такие как @{microsoft.windows.shellexperiencehost_10.0.17134.1_neutral_neutral_cw5n1h2txyewy?ms-resource://microsoft.windows.shellexperiencehost/resources/pkgdisplayname}
, которыми я не смог управлять с помощью netsh
. Переключение на PowerShell показывает, что настоящее имя было UID и устранило мою проблему, но код действительно медленно запускается:
PS C:\Users\vagrant\Desktop> Measure-Command {.\ps-slow.ps1 show}
Seconds : 48
...
В отличие от Measure-Command {show-netfirewallrule}
:
...
Milliseconds : 644
А netsh
:
PS C:\Users\vagrant\Desktop> Measure-Command { netsh advfirewall firewall show rule all verbose}
...
TotalSeconds : 1.0588127
Комментируя часть скрипта Get-NetFirewall*Filter
, он запускается на полной скорости, но, конечно, не хватает всех данных, которые я хочу. Идея состоит в том, чтобы собрать подробную информацию обо всех правилах брандмауэра и затем вывести лот в формате JSON.
У кого-нибудь есть идеи, как это оптимизировать? Я нуб PowerShell, поэтому я надеюсь, что пропустил что-то очевидное. Полный сценарий:
Show-NetFirewallRule | `
Where-Object { $_.cimclass.toString() -eq "root/standardcimv2:MSFT_NetFirewallRule" } | `
ForEach-Object { `
$af = $_ | Get-NetFirewallAddressFilter | Select-Object -First 1; # Assumes only one filter
$appf = $_ | Get-NetFirewallApplicationFilter | Select-Object -First 1; # Assumes only one filter
$pf = $_ | Get-NetFirewallPortFilter | Select-Object -First 1; # Assumes only one filter
$if = $_ | Get-NetFirewallInterfaceTypeFilter | Select-Object -First 1; # Assumes only one filter
New-Object -Type PSCustomObject -Property @{
Name = $_.Name
DisplayName = $_.DisplayName
Description = $_.Description
Enabled = $_.Enabled.toString()
Action = $_.Action.toString()
Direction = $_.Direction.toString()
EdgeTraversalPolicy = $_.EdgeTraversalPolicy.toString()
Profile = $_.Profile.toString()
DisplayGroup = $_.DisplayGroup
# Address Filter
LocalAddress = $af.LocalAddress
RemoteAddress = $af.RemoteAddress
LocalIp = $af.LocalIp
RemoteIp = $af.RemoteIp
# Port Filter
LocalPort = $pf.LocalPort
RemotePort = $pf.RemotePort
Protocol = $pf.Protocol
IcmpType = $pf.IcmpType
# Application Filter
Program = $appf.Program
# Interface Filter
InterfaceType = $if.InterfaceType.toString()
}
} | Convertto-json