How to know currently open ports on the Windows Firewall

windows 7windows-firewallwindows-server-2008

On Windows XP and Windows Server 2003, I can know currently open ports on the Windows Firewall using the following command:

netsh firewall show state

However, on Windows 7 and Hyper-V Server 2008 R2, when I give that command, it says:

No ports are currently open on all network interfaces.

IMPORTANT: Command executed successfully.
However, "netsh firewall" is deprecated;
use "netsh advfirewall firewall" instead.

Apparently there are ports open because services such as NetBIOS NS, Remote Desktop, and Hyper-V remote administration are functioning.

I tried a few 'netsh advfirewall' show commands, but didn't get a way to find out which ports are permit by Windows Firewall.

Knowing the currently open ports, I can be sure that I'm permitting necessary and sufficient traffic to pass in, no more, no less.

Going through the whole set of advanced firewall rules is so tedious and error-prone.

Is there a command on Windows 7 and Windows Server 2008 to do this efficiently?

Best Answer

The reason you can't get the same results using the same commands is that the Win7 firewall rules can be specific to an individual application, and configured per network type (Private, Domain, Public), protocol, port, etc. Powershell should give you a much better way to query this information and sort it. Here's a quick script I have to dump my configuration, when I need it.

Function Get-EnabledRules
{
    Param($profile)
    $rules = (New-Object -comObject HNetCfg.FwPolicy2).rules
    $rules = $rules | where-object {$_.Enabled -eq $true}
    $rules = $rules | where-object {$_.Profiles -bAND $profile}
    $rules
}

$networkListManager = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]"{DCB00C01-570F-4A9B-8D69-199FDBA5723B}"))
 $connections = $networkListManager.GetNetworkConnections()
[int[] ] $connTypes = @()
$connTypes = ($connections | % {$_.GetNetwork().GetCategory()})
#$connTypes += 1
Write-Host $connTypes

$connTypes | ForEach-Object {Get-EnabledRules -profile $_ | sort localports,Protocol | format-table -wrap -autosize -property Name, @{Label="Action"; expression={$_.action}}, @{Label="Protocol"; expression={$_.protocol}}, localPorts,applicationname}

A lot of this was based off of this post on MSDN

Related Topic