PowerShellで特定のポートをリッスンしているアプリケーションを確認する方法

listening portのprocess特定では、表示名ではなくLocalAddress・LocalPort・OwningProcess・StartTimeを最初の対象キーにします。変更や集計へ進む前にListen socketとPIDの対応を保存し、別対象を同じ結果へ混ぜないことが出発点です。

この手順の合格条件は「socket取得直後のprocess pathとstart timeを結び付けた状態」です。Microsoft Learn:Get-NetTCPConnectionのOwningProcessとGet-Processの実体確認が定義するGet-NetTCPConnectionのOwningProcessとGet-Processの実体確認を根拠にし、画面へ値が出たことだけを成功とは判定しません。

停止条件:system serviceのownerや目的が不明。該当するときは操作を進めず、読み取りだけなのでPIDを再取得して差分を確認するを実行可能な形で確認してから再計画します。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

listening portのprocess特定|完了像を先に言語化する:socket取得直後のprocess pathとstart timeを結び付けた状態

待受ポートとプロセスの特定を変更する場合は、IP、DNS、ゲートウェイ、NetworkCategory、接続中の管理経路を保存してからGet-NetTCPConnectionを一対象に限定します。合格はGet-NetTCPConnectionで意図した値だけが変わった状態です。

待受ポートとプロセスの特定の判断基準は名前解決、経路、TCP到達性、アダプター状態を別々に測ることです。Get-NetTCPConnectionがエラーを返す、対象が増減する、関連機能が使えない場合は合格にしません。

判断要素待受ポートとプロセスの特定で記録する内容
対象の識別InterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイル
最初の確認Get-NetTCPConnection
変更または操作Get-NetTCPConnection
再確認Get-NetTCPConnection
中止条件現在のRDPやVPNが唯一の管理経路で、変更後に再接続できない

次のGet-NetTCPConnectionを実行するときは、開始時刻と対象件数も記録します。対象インターフェースの選択違い、VPNや仮想NIC、IPv4/IPv6の取り違えがあるため、空結果だけで対象なしと結論づけません(待受ポートとプロセスの特定の判断では「0.0.0.0、127.0.0.1、::の待受範囲を区別する」を優先し、Get-NetTCPConnectionが空なら成功扱いしません)。

$port = 8080
$processBeforeById = @{}
Get-Process -ErrorAction Stop | ForEach-Object {
  try {
    $processBeforeById[[int]$_.Id] = [pscustomobject]@{
      Id = [int]$_.Id
      Name = $_.ProcessName
      StartTime = $_.StartTime
      Path = $_.Path
    }
  } catch {
    # Access-denied processes remain unverified instead of being guessed.
  }
}
$listeners = @(Get-NetTCPConnection -State Listen -LocalPort $port -ErrorAction SilentlyContinue)
$listeners | Select-Object LocalAddress, LocalPort, OwningProcess

0.0.0.0、127.0.0.1、::の待受範囲を区別する。PIDは再利用されるため取得時刻とプロセス開始時刻を残す。 そのため、Get-NetTCPConnectionの値は別の公式な取得経路またはGet-NetTCPConnectionと照合します。

listening portのprocess特定|表示名以外のキーで選ぶ:LocalAddress・LocalPort・OwningProcess・StartTime

待受ポートとプロセスの特定で使うPowerShellの版は $PSVersionTable で、コマンドの提供元は Get-Command Get-NetTCPConnection で確認します。プロセスパス確認は管理者。対象候補が複数ならInterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルを使い、表示名の部分一致だけで選びません(待受ポートとプロセスの特定の判断では「0.0.0.0、127.0.0.1、::の待受範囲を区別する」を優先し、Get-NetTCPConnectionが空なら成功扱いしません)。

  • 待受ポートとプロセスの特定: 実行端末と現在ユーザーを記録する
  • Get-NetTCPConnection: Source、Version、利用可能なパラメーターを確認する(待受ポートとプロセスの特定ではプロセスパス確認は管理者の範囲でGet-NetTCPConnectionが返す固有値を基準にします)。
  • InterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイル: 変更前の値を日時付きで保存する(待受ポートとプロセスの特定の判断では「0.0.0.0、127.0.0.1、::の待受範囲を区別する」を優先し、Get-NetTCPConnectionが空なら成功扱いしません)。
  • IP、DNS、ゲートウェイ、NetworkCategory、接続中の管理経路: 復旧に使えることを読み取り確認する(待受ポートとプロセスの特定ではプロセスパス確認は管理者の範囲でGet-NetTCPConnectionが返す固有値を基準にします)。
  • 現在のRDPやVPNが唯一の管理経路で、変更後に再接続できない: 該当すれば本番実行を見送る

待受確認ではGet-NetTCPConnectionからStateがListenの行を取り、LocalAddress、LocalPort、OwningProcessを保存します。InterfaceAliasや接続プロファイルではリスナーを一意にできないため、バインドアドレスとPIDを主キーにします。TCPとUDPは別の表にし、ESTABLISHED行を待受ソケットの代用にしません。取得時刻もPID照合へ引き継ぎます。

待受ポートとプロセスの特定の「基本的なコマンド」では、Get-NetTCPConnectionの取得時刻と対象件数を残します。後からGet-NetTCPConnectionを実行したとき、基本的なコマンドの差分理由を説明できる形にします。

特定ポートは数値で完全一致させ、Listen状態のOwningProcessを直後にGet-Process -Idへ渡します。プロセス名に加えてStartTimeとPathを取得し、PIDが再利用された可能性がある場合は同一アプリケーションと断定しません。

0.0.0.0と::は全インターフェース、127.0.0.1と::1はループバックへのバインドを示すため、同じポートでも到達範囲が異なります。接続情報とプロセス情報を同じ時刻帯で採取し、PIDだけを後日照会して結合しません。

待受ポートの確認は読み取りのみで、LocalAddress、LocalPort、OwningProcessを同一snapshotから取得します。PIDは再利用され得るため、processのStartTimeとPathを再取得して同一性を確認できない行は不確定として残します。

複数ポートを調べる場合は承認した整数の集合へLocalPortを照合し、各行のState、LocalAddress、OwningProcessを保持します。文字列の部分一致や範囲外ポートを混ぜず、ポートごとの件数が0か複数かを結果に残します。

Get-NetTCPConnectionが失敗した場合はNetTCPIPモジュールの利用可否と例外を記録し、空配列へ置き換えません。取得に成功した後も対象ポートのListen件数を数え、確立済み接続だけを待受アプリとして報告しないようにします。採取ホスト名も残します。

Select-Objectへ渡す対象はInterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルで一意にします(待受ポートとプロセスの特定の判断では「0.0.0.0、127.0.0.1、::の待受範囲を区別する」を優先し、Get-NetTCPConnectionが空なら成功扱いしません)。待受ポートとプロセスの特定の表示名だけを部分一致させて複数件を処理しません。

Get-Process照会の間にプロセスが終了した場合は競合状態として再採取し、別PIDの結果を継ぎ足しません。保護プロセスでPathを読めないケースは権限不足と記録し、NameとStartTimeまで一致する範囲だけを確認済みにします。

Test-NetConnectionへ渡す対象はInterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルで一意にします(待受ポートとプロセスの特定ではプロセスパス確認は管理者の範囲でGet-NetTCPConnectionが返す固有値を基準にします)。待受ポートとプロセスの特定の表示名だけを部分一致させて複数件を処理しません。

listening portのprocess特定|原状回復の参照値を保存する:読み取りだけなのでPIDを再取得して差分を確認する

待受ポートとプロセスの特定の変更前にはIP、DNS、ゲートウェイ、NetworkCategory、接続中の管理経路を保存します。保存したファイルや値が実際に読めることを確認し、同じ端末内の上書きだけをバックアップと呼びません(待受ポートとプロセスの特定の判断では「0.0.0.0、127.0.0.1、::の待受範囲を区別する」を優先し、Get-NetTCPConnectionが空なら成功扱いしません)。

待受ポートとプロセスの特定でGet-NetTCPConnectionを使う例は一対象に限定しています。WhatIfを利用できる場合は先に対象を表示し、外部コマンドでは読み取りオプションか検証端末を使います(待受ポートとプロセスの特定ではGet-NetTCPConnectionが同じ対象を返さない場合、確認のみなら復旧不要)。

foreach ($socket in $listeners) {
  $ownerProcessId = [int]$socket.OwningProcess
  $beforeIdentity = $processBeforeById[$ownerProcessId]
  try {
    if ($null -eq $beforeIdentity) { throw "No pre-socket process identity for PID $ownerProcessId" }
    $processAfterSocket = Get-Process -Id $ownerProcessId -ErrorAction Stop
    if ($processAfterSocket.StartTime -ne $beforeIdentity.StartTime -or $processAfterSocket.Path -ne $beforeIdentity.Path) {
      throw "PID $ownerProcessId changed across the socket snapshot"
    }
    $listenerAfter = @(Get-NetTCPConnection -State Listen -LocalPort $socket.LocalPort -ErrorAction SilentlyContinue | Where-Object {
      $_.LocalAddress -eq $socket.LocalAddress -and [int]$_.OwningProcess -eq $ownerProcessId
    })
    if ($listenerAfter.Count -ne 1) { throw 'The original listener disappeared, changed owner, or became ambiguous' }
    $processAfterListener = Get-Process -Id $ownerProcessId -ErrorAction Stop
    if ($processAfterListener.StartTime -ne $beforeIdentity.StartTime -or $processAfterListener.Path -ne $beforeIdentity.Path) {
      throw "PID $ownerProcessId changed during listener revalidation"
    }
    [pscustomobject]@{
      Address = $listenerAfter[0].LocalAddress
      Port = $listenerAfter[0].LocalPort
      PID = $ownerProcessId
      Process = $processAfterListener.ProcessName
      Path = $beforeIdentity.Path
      StartTime = $beforeIdentity.StartTime
      ListenerRevalidated = $true
      IdentityVerified = $true
    }
  } catch {
    [pscustomobject]@{ Address=$socket.LocalAddress; Port=$socket.LocalPort; PID=$ownerProcessId; ListenerRevalidated=$false; IdentityVerified=$false; Error=$_.Exception.Message }
  }
}

Get-NetTCPConnectionが何も返さなくても成功とは判断しません。Get-NetTCPConnectionと関連機能の利用テストを続けます。

listening portのprocess特定|利用側の結果まで確かめる:socket取得直後のprocess pathとstart timeを結び付けた状態

Get-NetTCPConnectionでは、変更前に保存したInterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルと同じ対象を選びます。名前解決、経路、TCP到達性、アダプター状態を別々に測ることで、別スコープの値を成功結果として採用しません(待受ポートとプロセスの特定ではGet-NetTCPConnectionの対象件数とGet-NetTCPConnectionの再取得値を一致させます)。

$currentListeners = @(Get-NetTCPConnection -State Listen -LocalPort $port -ErrorAction SilentlyContinue)
$currentListeners | Select-Object LocalAddress, LocalPort, OwningProcess
if ($currentListeners.Count -eq 0) { Write-Warning "No listener currently remains on port $port" }
Test-NetConnection localhost -Port $port
  • Get-NetTCPConnection: 同じ対象IDを再取得できた
  • 待受ポートとプロセスの特定: 意図した値または件数だけが変化した
  • 名前解決、経路、TCP到達性、アダプター状態を別々に測る: 関連機能も異常がない
  • 対象インターフェースの選択違い、VPNや仮想NIC、IPv4/IPv6の取り違え: 取得失敗をゼロ件として扱っていない(待受ポートとプロセスの特定ではGet-NetTCPConnectionが同じ対象を返さない場合、確認のみなら復旧不要)。
  • 0.0.0.0、127.0.0.1、::の待受範囲を区別する。PIDは再利用されるため取得時刻とプロセス開始時刻を残す。: 環境固有の制約に反していない

listening portのprocess特定|続行しない境界を明示する:system serviceのownerや目的が不明

待受ポートとプロセスの特定でアクセス拒否が出た場合は、すぐ管理者として再実行せずプロセスパス確認は管理者という必要範囲を確認します。対象側のACLや管理ロールも分けて調べます。

待受ポートとプロセスの特定が時間経過後に元へ戻る場合は、GPO/MDM、同期、サービス再起動、別スコープを調べます。繰り返し上書きして管理設定と競合させません。

0.0.0.0、127.0.0.1、::の待受範囲を区別する。PIDは再利用されるため取得時刻とプロセス開始時刻を残す。 この条件を満たさない結果は、コマンドの終了コードが0でも合格にしません。

断定できません。待受ポートとプロセスの特定では対象インターフェースの選択違い、VPNや仮想NIC、IPv4/IPv6の取り違えでも空になります。エラーを表示し、権限とスコープを確認してからGet-NetTCPConnectionまたは別の公式な取得方法で照合します。

listening portのprocess特定|rollback後も同じ検証を行う:読み取りだけなのでPIDを再取得して差分を確認する

確認のみなら復旧不要。プロセス停止や規則変更はサービス所有者、署名、依存関係、保守時間を確認して別作業にする。

待受ポートとプロセスの特定を戻した後はGet-NetTCPConnectionとGet-NetTCPConnectionを再実行し、InterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルが変更前記録と一致することを確認します。復旧処理にも失敗したら連続操作を止め、保存したIP、DNS、ゲートウェイ、NetworkCategory、接続中の管理経路とログを担当者へ渡します(待受ポートとプロセスの特定ではGet-NetTCPConnectionの対象件数とGet-NetTCPConnectionの再取得値を一致させます)。

listening portのprocess特定|監査で追える証拠をまとめる:Listen socketとPIDの対応

  • Get-NetTCPConnectionの実行時刻、対象件数、エラー件数を残した
  • InterfaceAlias、InterfaceIndex、IPアドレス、接続プロファイルで対象を一意に特定した(待受ポートとプロセスの特定ではGet-NetTCPConnectionが同じ対象を返さない場合、確認のみなら復旧不要)。
  • IP、DNS、ゲートウェイ、NetworkCategory、接続中の管理経路を変更前に保存して読めることを確認した(待受ポートとプロセスの特定ではGet-NetTCPConnectionの対象件数とGet-NetTCPConnectionの再取得値を一致させます)。
  • Get-NetTCPConnectionの対象を一端末・一ユーザー・一設定に限定した
  • Get-NetTCPConnectionと実利用テストの両方を確認した
  • 現在のRDPやVPNが唯一の管理経路で、変更後に再接続できない場合は実行を中止した

listening portのprocess特定|例外条件を質問から整理する:IPv6 wildcard listenerも数えるか

権限だけが原因とは限りません。0.0.0.0、127.0.0.1、::の待受範囲を区別する。PIDは再利用されるため取得時刻とプロセス開始時刻を残す。 現在のRDPやVPNが唯一の管理経路で、変更後に再接続できないなら昇格して続行せず、対応Edition、対象ID、ポリシー、復旧経路を確認します(待受ポートとプロセスの特定ではGet-NetTCPConnectionが同じ対象を返さない場合、確認のみなら復旧不要)。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次