PowerShellでWindowsのアクティブなTCP/IP接続を確認する方法(Get-NetTCPConnection活用ガイド)
多くの管理者は、WindowsでアクティブなTCP/IP接続や開いているTCPポートの情報を表示する際に、netstatコマンドラインツールやGUIツールのTCPViewを使用することが一般的です。しかし、PowerShellのGet-NetTCPConnectionコマンドレットを使えば、netstatに代わってアクティブなネットワーク接続、開放中のTCPポート、TCP/IPプロトコルを使用している実行中プロセスの情報を取得できます。PowerShellなら複雑なスクリプトも簡単に作成でき、開いているTCPポートやプロセス、確立されたネットワーク接続の監視も効率的に行えます。
Get-NetTCPConnectionの基本的な使い方
まず、オプションを指定せずにGet-NetTCPConnectionコマンドを実行してみましょう。

netstatと同様に、このコマンドはローカルおよびリモートのIPアドレス、ポート番号、接続状態(Listen、Established、TimeWait、Bound、CloseWait、SynReceived、SynSentなど)、そしてそのTCP接続を使用しているプロセスID(PID)の一覧を表示します。
ローカルコンピューターのリスニングポート一覧を表示する
ローカルコンピューターで開いている(待ち受け状態の)ポートの一覧を表示するには、次のコマンドを実行します。
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort | ft
なお、UDPポートの情報を取得したい場合は、Get-NetUDPEndpointコマンドレットを使用します。
外部(インターネット)への接続のみを表示する
インターネットへの外部接続だけを絞り込んで表示することも可能です。
Get-NetTCPConnection -AppliedSetting InternetリモートホストのDNS名とプロセス名を表示する
TCP接続に対して、リモートホストのDNS名とプロセス名を併せて表示するには、次のようなスクリプトが便利です。
Get-NetTCPConnection -State Established | Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}},OffloadState,CreationTime | ftこのPowerShellスクリプトは、すべての接続先IPアドレスをDNS名に解決し、各接続に対応するプロセス名も特定して表示します。

ネットワークを使用しているWindowsサービスの一覧を取得する
親プロセスのPIDをもとに、ネットワークを使用している関連するWindowsサービスの一覧を表示できます。
Get-WmiObject Win32_Service | Where-Object -Property ProcessId -In (Get-NetTCPConnection).OwningProcess | Where-Object -Property State -eq Running | Format-Table ProcessId, Name, Caption, StartMode, State, Status, PathName特定のプロセスによる接続のみを確認する
特定のプロセスが開始したネットワーク接続だけを表示したい場合は、以下のPowerShellスクリプトを使用します。この例ではChromeブラウザーの接続を追跡しています。
$TrackProcessName = "*chrome*"
$EstablishedConnections = Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}}, OffloadState,CreationTime
Foreach ($Connection in $EstablishedConnections)
{
If ($Connection.ProcessName -like $TrackProcessName)
{
$Connection|ft
}
}応用例:RDP接続の監視とポップアップ通知
Get-NetTCPConnectionコマンドレットはさまざまなシナリオで活用できます。たとえば、特定のIPアドレスから指定されたローカルポートへの接続が確立されたかどうかを監視し、管理者にポップアップ通知を表示するシンプルなPowerShellスクリプトを作成できます。
次の例では、指定したIPアドレスからの接続がデフォルトのRDPポート3389に現れたかどうかをスクリプトがチェックします。接続を検出すると、ポップアップ通知を表示し、接続の日時をテキストファイルに記録します。
$SourceIP = "192.168.13.125"
$TargetPort ="3389"
$log = "C:\PS\rdp_connection_log.txt"
$EstablishedConnections = Get-NetTCPConnection -State Established
Foreach ($Connection in $EstablishedConnections)
{
If (($Connection.RemoteAddress -eq $SourceIP) -and ($Connection.LocalPort -eq $TargetPort))
{
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = "New RDP connection to your computer from $($Connection.RemoteAddress)"
$balmsg.BalloonTipTitle = "New RDP connection from ($Connection.RemoteAddress)"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
(Get-Date).ToString() + ' ' + $Connection.RemoteAddress + ' an RDP connection is established ' >> $log
}
}
同じ仕組みを使えば、SSH、SMB、FTP、SMTPなど他のプロトコル経由のネットワーク接続も監視・ログ記録できます。さらに、このPowerShellスクリプトは自動起動するWindowsサービスに変換することも可能です。以前紹介した「PowerShellによるRDPブルートフォース攻撃対策」のスクリプトと組み合わせて使用すれば、より強固なセキュリティ監視体制を構築できます。
リモートコンピューターの接続状況を確認する
PowerShellリモーティングのコマンドレット(Enter-PSSessionやInvoke-Command)を使用すれば、リモートコンピューター上の開いているTCPポートと接続の一覧も取得できます。
Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}Get-NetTCPConnectionコマンドレット(およびTest-NetConnection)は、Windowsにおけるネットワーク接続の追跡とトラブルシューティングにおいて非常に有用なツールです。日常的なネットワーク管理やセキュリティ監査にぜひ活用してください。
-
PowerShellまたはWevtutilを使用してWindowsイベントログをクリアする方法
コンピューターやサーバー上のWindowsイベントログから、すべてのエントリを削除したいケースがあります。もちろん、イベントビューアーのGUI(Eventvwr.msc)からシステムログをクリアすることも可能です(対象のログを右クリックし、「ログのクリア」を選択)。しかし、Windows Vista以降、システムはさまざまなコンポーネントごとに数十種類ものログを使用しており、イベントビューアーから手作業ですべてをクリアするのは非常に手間がかかります。 そこで便利なのが、コマンドラインからの操作です。PowerShellまたは内蔵コンソールツールwevtutilを使えば、効率的にログをクリアでき
-
Windows PowerShellで生産性を向上させる|基本機能から学習方法まで徹底解説
もし、Linuxならではの高い生産性をWindows上でも実現できたら――そう考えたことはありませんか? WindowsとLinuxの大きな違いの一つは、多くのLinuxディストリビューションが強力な「Bash」シェルを標準搭載している点にあります。一方、従来のWindowsコマンドプロンプトは機能が最小限にとどまっており、本格的な作業には物足りなさを感じる人も少なくありませんでした。 しかし、PowerShellを使えば、その悩みは一変します。 補足:PowerShellはいわゆる「Windows版Bash」ではありません。どちらもコマンドライン環境であり、作業効率を大きく高められるという共