ใน Windows XP และ Windows Server 2003 ฉันสามารถทราบพอร์ตที่เปิดอยู่บนไฟร์วอลล์ Windows โดยใช้คำสั่งต่อไปนี้:

netsh firewall show state

อย่างไรก็ตาม ใน Windows 7 และ Hyper-V Server 2008 R2 เมื่อฉันให้คำสั่งนั้น มันบอกว่า:

No ports are currently open on all network interfaces.

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

เห็นได้ชัดว่ามีพอร์ตเปิดอยู่เนื่องจากบริการต่างๆ เช่น NetBIOS NS, Remote Desktop และการดูแลระบบระยะไกล Hyper-V กำลังทำงานอยู่

ฉันลองใช้คำสั่งแสดง 'netsh advfirewall' สองสามคำสั่ง แต่ไม่พบวิธีค้นหาพอร์ตใดที่ Windows Firewall อนุญาต

เมื่อทราบพอร์ตที่เปิดอยู่ในปัจจุบัน ฉันสามารถมั่นใจได้ว่าฉันอนุญาตให้มีการรับส่งข้อมูลที่จำเป็นและเพียงพอในการผ่านเข้าไป ไม่มาก ไม่น้อย

การปฏิบัติตามกฎไฟร์วอลล์ขั้นสูงทั้งชุดเป็นเรื่องที่น่าเบื่อหน่ายและเกิดข้อผิดพลาดได้ง่าย

มีคำสั่งใน Windows 7 และ Windows Server 2008 ให้ดำเนินการอย่างมีประสิทธิภาพหรือไม่

answer

สาเหตุที่คุณไม่สามารถได้ผลลัพธ์เดียวกันโดยใช้คำสั่งเดียวกันก็คือกฎไฟร์วอลล์ 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