在 Windows XP 和 Windows Server 2003 上,我可以使用以下命令了解 Windows 防火墙上当前打开的端口:
netsh firewall show state
但是,在 Windows 7 和 Hyper-V Server 2008 R2 上,当我输入该命令时,它显示:
当前所有网络接口上均未打开任何端口。
重要提示:命令已成功执行。
但是,“netsh 防火墙”已弃用;
请改用“netsh advfirewall 防火墙”。
显然,由于 NetBIOS NS、远程桌面和 Hyper-V 远程管理等服务正在运行,因此端口是开放的。
我尝试了一些“netsh advfirewall”显示命令,但没有办法找出 Windows 防火墙允许哪些端口。
了解当前开放的端口后,我可以确保允许必要且足够的流量进入,不多也不少。
浏览整套高级防火墙规则非常繁琐且容易出错。
Windows 7 和 Windows Server 2008 上是否有命令可以有效地执行此操作?
答案1
您无法使用相同命令获得相同结果的原因是 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}
其中很大一部分是基于这在 MSDN 上发帖