PowerShell 2 min read

Use PowerShell to Get Firewall Rules from Remote Computer (Get-FirewallRules)

Michael Wu ·

I needed a way to troubleshoot firewall issues by viewing applied rules without relying on RDP and navigating through the Windows Firewall GUI.

The Function

<#
.SYNOPSIS
    Show Firewall rules from the remote computer
.EXAMPLE
    Get-FirewallRules dsc-tst1
.EXAMPLE
    Get-FirewallRules -ComputerName dsc-tst1 -Name "Core*" -LocalPort RPC
#>
function Get-FirewallRules {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, Position = 0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true)]
        [string]$ComputerName = $env:computername,

        [Parameter(Mandatory = $false)]
        [ValidateSet("True", "False")]
        [string]$Enabled = "True",

        [Parameter(Mandatory = $false)]
        [string]$Name = "",

        [Parameter(Mandatory = $false)]
        [string]$Protocol = "",

        [Parameter(Mandatory = $false)]
        [string]$LocalPort = "",

        [Parameter(Mandatory = $false)]
        [string]$RemoteAddress = ""
    )

    begin {
        if (-not (Test-Connection $ComputerName -Quiet -Count 1)) {
            Write-Host "$ComputerName is offline..." -ForegroundColor Red
            break
        }
        if (-not (Test-WSMan $ComputerName -ErrorAction SilentlyContinue)) {
            Write-Host "PowerShell Remoting is disabled..." -ForegroundColor Red
            break
        }
    }

    process {
        $rules = Invoke-Command $ComputerName -ScriptBlock {
            $FWObjs = @()
            $fws = Get-NetFirewallRule -Direction Inbound -PolicyStore ActiveStore `
                -Action Allow -Enabled $args[0]

            foreach ($fw in $fws) {
                $remoteAddress2 = $fw | Get-NetFirewallAddressFilter |
                    Select-Object -ExpandProperty RemoteAddress
                $protocol2 = $fw | Get-NetFirewallPortFilter |
                    Select-Object -ExpandProperty Protocol
                $localPort2 = $fw | Get-NetFirewallPortFilter |
                    Select-Object -ExpandProperty LocalPort

                $fw | Add-Member -MemberType NoteProperty -Name Protocol -Value $protocol2
                $fw | Add-Member -MemberType NoteProperty -Name LocalPort -Value $localPort2
                $fw | Add-Member -MemberType NoteProperty -Name RemoteAddress -Value $remoteAddress2
                $FWObjs += $fw
            }

            $FWObjs | Sort-Object displayname |
                Where-Object displayname -NotLike "@{Microsoft.*" |
                Select-Object displayname, RemoteAddress, Protocol, LocalPort
        } -ArgumentList $Enabled

        # Apply filters
        $filtered = $rules
        if ($Name) { $filtered = $filtered | Where-Object displayname -Like $Name }
        if ($Protocol) { $filtered = $filtered | Where-Object Protocol -EQ $Protocol }
        if ($LocalPort) { $filtered = $filtered | Where-Object LocalPort -Contains $LocalPort }
        if ($RemoteAddress) { $filtered = $filtered | Where-Object RemoteAddress -Contains $RemoteAddress }

        $filtered | Sort-Object displayname |
            Select-Object displayname, RemoteAddress, Protocol, LocalPort
    }
}

Usage Examples

# Basic query
Get-FirewallRules DSC-TST1

# Filter by port
Get-FirewallRules DSC-TST1 | Where-Object localport -eq 80 | Format-Table

# Expand remote address
Get-FirewallRules DSC-TST1 |
    Where-Object displayname -eq "Test Fw" |
    Select-Object -ExpandProperty RemoteAddress

The function supports filtering by Name, RemoteAddress, Protocol, and LocalPort parameters.