web-dev-qa-db-ja.com

Windowsファイアウォールで現在開いているポートを知る方法は?

Windows XPおよびWindows Server 2003では、次のコマンドを使用して、Windowsファイアウォールで現在開いているポートを確認できます。

netsh firewall show state

ただし、Windows 7およびHyper-V Server 2008 R2では、そのコマンドを実行すると次のように表示されます。

現在、すべてのネットワークインターフェイスで開いているポートはありません。

重要:コマンドは正常に実行されました。
ただし、「netshファイアウォール」は非推奨です。
代わりに「netsh advfirewall firewall」を使用してください。

NetBIOS NS、リモートデスクトップ、Hyper-Vリモート管理などのサービスが機能しているため、開いているポートがあるようです。

「netsh advfirewall」のshowコマンドをいくつか試しましたが、Windowsファイアウォールで許可されているポートを確認する方法がありませんでした。

現在開いているポートを知っているので、必要かつ十分なトラフィックが通過することを許可していることは確かです。

高度なファイアウォールルールのセット全体を実行するのは、面倒でエラーが発生しやすい作業です。

これを効率的に行うためのコマンドがWindows 7およびWindows Server 2008にありますか?

6
QIU Quan

同じコマンドを使用しても同じ結果が得られない理由は、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への this の投稿に基づいています

3
DanielKi