PowerShellを使って特定のポートを監視する方法

PowerShellを使って特定のポートを監視する方法という問いには、承認済みのFQDNと一つのTCPポートを一定間隔で試し、連続失敗と回復時刻を記録するという方法で答えます。Get-NetTCPConnectionはローカル端末の接続表を読み、リモートサービスの到達性はTest-NetConnectionで検査する。目的に応じて使い分ける。この記事では監視先FQDN、解決IP、RemotePort、測定時刻、TcpTestSucceeded、遅延を一サンプルにするを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

seq86の『どのプロセスが待受中か』ではなく、指定サービスが時間経過の中で到達可能かを監視する。完了は「監視期間中の各試行に時刻と成否が付き、障害判定に必要な連続失敗数と回復を示せる」と定義します。対象が取れない場合は「接続表0件は未到達を意味しない。DNS失敗、タイムアウト、明示拒否を別の状態として記録する」として切り分け、推測で成功扱いにしません。

目次

監視対象をホスト名とポートで定義

承認済みのFQDNと一つのTCPポートを一定間隔で試し、連続失敗と回復時刻を記録する。特定TCPポートの到達性監視ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。seq86の『どのプロセスが待受中か』ではなく、指定サービスが時間経過の中で到達可能かを監視する。

監視対象をホスト名とポートで定義の合格条件は、監視期間中の各試行に時刻と成否が付き、障害判定に必要な連続失敗数と回復を示せることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

開始前にDNS解決を保存

開始前にDNS解決を保存では、特定TCPポートの到達性監視の対象を「監視先FQDN、解決IP、RemotePort、測定時刻、TcpTestSucceeded、遅延を一サンプルにする」という単位で扱います。Get-NetTCPConnectionはローカル端末の接続表を読み、リモートサービスの到達性はTest-NetConnectionで検査する。目的に応じて使い分ける。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

特定TCPポートの到達性監視を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

一定間隔でTcpTestSucceededを採る

一定間隔でTcpTestSucceededを採るは変更前の基準点です。監視先FQDN、解決IP、RemotePort、測定時刻、TcpTestSucceeded、遅延を一サンプルにするを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$targetFqdn = 'service.contoso.example'
$remotePort = 443
$intervalSeconds = 60
$sampleCount = 10
$failureThreshold = 3
if ($sampleCount -lt 1 -or $sampleCount -gt 120) { throw 'サンプル数は1~120に制限します。' }
if ($intervalSeconds -lt 30) { throw '監視間隔は30秒以上にしてください。' }
$initialDns = @(Resolve-DnsName -Name $targetFqdn -Type A -ErrorAction Stop | Where-Object IPAddress)
if ($initialDns.Count -eq 0) { throw '開始前のDNS解決結果が0件です。' }
$initialDns | Select-Object Name, IPAddress

Get-NetTCPConnectionはローカル端末の接続表を読み、リモートサービスの到達性はTest-NetConnectionで検査する。目的に応じて使い分ける。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

成功・失敗の連続回数を数える

成功・失敗の連続回数を数えるでは、承認済みのFQDNと一つのTCPポートを一定間隔で試し、連続失敗と回復時刻を記録する。特定TCPポートの到達性監視の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$samples = [Collections.Generic.List[object]]::new()
$consecutiveFailures = 0
$previousSucceeded = $null
for ($i = 1; $i -le $sampleCount; $i++) {
  $measuredAt = Get-Date
  $stopwatch = [Diagnostics.Stopwatch]::StartNew()
  $addresses = @()
  $probe = $null
  $reason = $null
  try {
    $addresses = @(Resolve-DnsName -Name $targetFqdn -Type A -ErrorAction Stop |
      Where-Object IPAddress | Select-Object -ExpandProperty IPAddress)
    if ($addresses.Count -eq 0) { throw 'DNS address count is zero' }
    $probe = Test-NetConnection -ComputerName $targetFqdn -Port $remotePort -WarningAction SilentlyContinue
    $succeeded = [bool]$probe.TcpTestSucceeded
    if (-not $succeeded) { $reason = 'TcpTestFailed' }
  } catch {
    $succeeded = $false
    $reason = "DnsOrProbeError: $($_.Exception.Message)"
  } finally {
    $stopwatch.Stop()
  }
  if ($succeeded) { $consecutiveFailures = 0 } else { $consecutiveFailures++ }
  $state = if ($succeeded -and $previousSucceeded -eq $false) {
    'Recovered'
  } elseif (-not $succeeded -and $consecutiveFailures -ge $failureThreshold) {
    'Degraded'
  } elseif ($succeeded) {
    'Healthy'
  } else {
    'TransientFailure'
  }
  $samples.Add([pscustomobject]@{
    Sequence=$i; MeasuredAt=$measuredAt; Fqdn=$targetFqdn
    ResolvedIPs=($addresses -join ','); RemotePort=$remotePort
    RemoteAddress=if ($probe) { $probe.RemoteAddress } else { $null }
    TcpTestSucceeded=$succeeded; ElapsedMs=$stopwatch.ElapsedMilliseconds
    ConsecutiveFailures=$consecutiveFailures; State=$state; Reason=$reason
  })
  $previousSucceeded = $succeeded
  if ($i -lt $sampleCount) { Start-Sleep -Seconds $intervalSeconds }
}

短すぎる間隔で相手へ負荷をかけない。任意ポートを走査せず、許可された一ポートだけを監視する。特定TCPポートの到達性監視でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

localhostのListen状態を補助確認

localhostのListen状態を補助確認では同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、監視期間中の各試行に時刻と成否が付き、障害判定に必要な連続失敗数と回復を示せるかどうかです。

$samples | Format-Table MeasuredAt, Fqdn, RemotePort, TcpTestSucceeded,
  ElapsedMs, ConsecutiveFailures, State, Reason
$degraded = @($samples | Where-Object State -eq 'Degraded')
$recovered = @($samples | Where-Object State -eq 'Recovered')
[pscustomobject]@{
  Samples=$samples.Count; FailureThreshold=$failureThreshold
  DegradedSamples=$degraded.Count; RecoveryEvents=$recovered.Count
  FirstFailure=($samples | Where-Object { -not $_.TcpTestSucceeded } | Select-Object -First 1).MeasuredAt
  LastRecovery=($recovered | Select-Object -Last 1).MeasuredAt
}

接続表0件は未到達を意味しない。DNS失敗、タイムアウト、明示拒否を別の状態として記録する。特定TCPポートの到達性監視の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

一回のタイムアウトで障害にしない

短すぎる間隔で相手へ負荷をかけない。任意ポートを走査せず、許可された一ポートだけを監視する。一回のタイムアウトで障害にしないに該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

接続表0件は未到達を意味しない。DNS失敗、タイムアウト、明示拒否を別の状態として記録する。特定TCPポートの到達性監視ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

監視停止条件とログ上限

アラートは一回の失敗でなく連続回数と監視窓で決め、計画停止を除外できるようにする。特定TCPポートの到達性監視を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

監視停止条件とログ上限の識別軸監視先FQDN、解決IP、RemotePort、測定時刻、TcpTestSucceeded、遅延を一サンプルにする
採用する実測監視期間中の各試行に時刻と成否が付き、障害判定に必要な連続失敗数と回復を示せる
0件時の扱い接続表0件は未到達を意味しない。DNS失敗、タイムアウト、明示拒否を別の状態として記録する
保留にする兆候短すぎる間隔で相手へ負荷をかけない。任意ポートを走査せず、許可された一ポートだけを監視する

特定TCPポートの到達性監視の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「監視先FQDN、解決IP、RemotePort、測定時刻、TcpTestSucceeded、遅延を一サンプルにする」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellを使って特定のポートを監視する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「監視期間中の各試行に時刻と成否が付き、障害判定に必要な連続失敗数と回復を示せる」、判定不能時は「接続表0件は未到達を意味しない。DNS失敗、タイムアウト、明示拒否を別の状態として記録する」、中止時は「短すぎる間隔で相手へ負荷をかけない。任意ポートを走査せず、許可された一ポートだけを監視する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:ローカルListen表ではなく一つの承認済みリモートFQDNとTCPポートを監視します。各試行でDNSとTCPを分離し、3回連続失敗でDegraded、失敗後の最初の成功でRecoveredと記録し、有限回数・60秒間隔で相手への負荷を制限します。

公式情報・参考資料

特定TCPポートの到達性監視で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

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

コメント

コメントする

目次