如何知道 Windows 防火墙上当前打开的端口?

QIU*_*uan 8 windows-server-2008 windows-7 windows-firewall

在 Windows XP 和 Windows Server 2003 上,我可以使用以下命令知道 Windows 防火墙上当前打开的端口:

netsh firewall show state
Run Code Online (Sandbox Code Playgroud)

但是,在 Windows 7 和 Hyper-V Server 2008 R2 上,当我给出该命令时,它说:

当前没有在所有网络接口上打开任何端口。

重要提示:命令已成功执行。
但是,不推荐使用“netsh firewall”;
请改用“netsh advfirewall 防火墙”。

显然有端口打开是因为 NetBIOS NS、远程桌面和 Hyper-V 远程管理等服务正在运行。

我尝试了一些“netsh advfirewall”显示命令,但没有办法找出 Windows 防火墙允许哪些端口。

知道当前打开的端口,我可以确定我允许必要和足够的流量传入,不多也不少。

浏览整套高级防火墙规则既乏味又容易出错。

Windows 7 和 Windows Server 2008 上是否有命令可以有效地执行此操作?

小智 5

使用相同的命令无法获得相同结果的原因是 Win7 防火墙规则可以特定于单个应用程序,并根据网络类型(专用、域、公共)、协议、端口等进行配置。Powershell 应该给出您可以更好地查询此信息并对其进行排序。这是一个快速脚本,我必须在需要时转储我的配置。

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}
Run Code Online (Sandbox Code Playgroud)

其中大部分内容均基于MSDN 上的这篇文章