Windows で TCP/UDP ポートをリスニングしているプロセスを確認するコード例解説

2024-08-17

Windows で TCP/UDP ポートをリスニングしているプロセスを確認する方法

Windows 上で特定の TCP/UDP ポートをリスニングしているプロセスを調べるには、コマンドプロンプトや PowerShell を使用します。主に netstat コマンドと tasklist コマンド(または PowerShell の Get-Process コマンド)を組み合わせます。

コマンドプロンプトを使用した方法

  1. コマンドプロンプトを開く:スタートメニューから「コマンドプロンプト」を検索して開きます。
  2. リスニングポートを確認する
    netstat -ano
    
    このコマンドは、すべてのネットワーク接続とリスニングポートの一覧を表示します。
    • -a オプションはすべての接続を表示します。
    • -n オプションは数値形式でアドレスとポート番号を表示します。
    • -o オプションは所有するプロセス ID (PID) を表示します。
  3. プロセス名を確認する
    tasklist /FI "PID eq <PID>"
    
    <PID> の部分には、ステップ 2 で確認したプロセス ID を入力します。このコマンドは、指定した PID のプロセスに関する情報を表示します。

PowerShell を使用する方法

  1. PowerShell を開く:スタートメニューから「PowerShell」を検索して開きます。
  2. リスニングポートを確認する
    netstat -ano
    
    これはコマンドプロンプトと同じコマンドですが、PowerShell でも使用できます。
  3. プロセス情報を取得する
    Get-NetTCPConnection | Where-Object {$_.LocalPort -eq <ポート番号>} | Select-Object -ExpandProperty OwningProcess
    
    このコマンドは、指定したポート番号でリスニングしている TCP 接続のプロセス ID を取得します。
    • <ポート番号> の部分には確認したいポート番号を入力します。
    • 取得したプロセス ID を使って Get-Process コマンドでプロセス名を確認できます。

netstat -ano

の結果が以下のような場合:

TCP        0.0.0.0:80              0.0.0.0:0              LISTENING       4680

この場合、ポート 80 をリスニングしているプロセス ID は 4680 です。次に、

tasklist /FI "PID eq 4680"

または PowerShell で

Get-Process -Id 4680

を実行すると、プロセス名を確認できます。

注意点

  • netstat コマンドの出力は大量になる可能性があります。特定のポートを検索する場合は、パイプを使ってフィルタリングすることができます。
  • プロセス名は変更される可能性があるため、プロセス ID を基準に確認することが確実です。
  • ファイアウォールやネットワーク設定によっては、一部の接続が表示されない場合があります。
  • PowerShell の方法はより柔軟で強力ですが、コマンドプロンプトの方法でも基本的な情報は取得できます。



以下では、C# を用いて Windows でポートリスニングプロセスを確認するコード例を解説します。

C# コード例

using System;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;

namespace PortListenerChecker
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 80; // 確認したいポート番号

            try
            {
                IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
                IPEndPoint[] tcpEndPoints = ipGlobalProperties.GetActiveTcpListe   ners();

                foreach (IPEndPoint tcpEndPoint in tcpEndPoints)
                {
                    if (tcpEndPoint.Port == port)
                    {
                        // プロセス ID を取得
                        int processId = tcpEndPoint.ProcessId;

                        // プロセス名を取得
                        Process process = Process.GetProcessById(processId);
                        Console.WriteLine($"ポート {port} をリスニングしているプロセス: {process.ProcessName}");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"エラーが発生しました: {ex.Message}");
            }
        }
    }
}

コード解説

  1. 必要な名前空間のインポート:

    • System.Net: ネットワーク関連のクラスを提供します。
    • System.Net.Sockets: ソケット操作に関するクラスを提供します。
    • System.Diagnostics: プロセスに関する情報を取得するためのクラスを提供します。
  2. ポート番号の指定:

  3. IPGlobalProperties クラスの利用:

  4. アクティブな TCP リスナーの取得:

  5. ポート番号の比較とプロセス情報の取得:

    • 取得した各 TCP エンドポイントのポート番号と、指定したポート番号を比較します。
    • ポート番号が一致する場合、ProcessId プロパティからプロセス ID を取得し、Process.GetProcessById() メソッドでプロセスオブジェクトを取得します。
    • 取得したプロセスオブジェクトの ProcessName プロパティからプロセス名を取得し、コンソールに出力します。

実行方法

  • Visual Studio などの開発環境で、上記のコードをコンパイルして実行します。
  • 実行時に、確認したいポート番号を適切に設定します。
  • UDP ポート: TCP ポートだけでなく、UDP ポートについても同様の方法で確認できます。GetActiveUdpListeners() メソッドを使用します。
  • エラー処理: 例外処理を追加することで、プログラムの安定性を高めることができます。
  • パフォーマンス: 多くのポートを監視する場合、パフォーマンスに影響が出る可能性があります。最適化が必要な場合は、並列処理や非同期処理を検討する必要があります。
  • .NET Framework/Core: 上記のコードは .NET Framework/Core を対象としています。他のプラットフォームや言語では、異なるライブラリや関数を使用する必要があります。

注意:

  • 上記のコードはあくまで一例であり、実際の環境に合わせて適宜修正する必要があります。
  • セキュリティ上の理由から、任意のポートに対してこの処理を実行することは避けるべきです。
  • PowerShell を利用したスクリプト作成も可能です。PowerShell の Get-NetTCPConnectionGet-NetUDPConnection コマンドを使用することで、より簡潔に情報を取得できます。
  • WMI (Windows Management Instrumentation) を利用することもできます。WMI を使用すると、より詳細なシステム情報を取得できます。



Windows ポートリスニングプロセス確認方法の代替プログラミング手法

C# を超えて:多様なアプローチ

C# による例は非常に分かりやすかったですが、Windows でポートリスニングプロセスを確認する方法は、C# だけに限定されません。他のプログラミング言語やツール、API を用いた様々なアプローチが存在します。

PowerShell

  • スクリプトによる自動化: C# のコードよりも簡潔に記述できることが多いです。
  • 例:
    Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 80} | Select-Object -ExpandProperty OwningProcess
    
  • メリット: Windows 環境に標準で搭載されており、学習コストが比較的低い。

Python

  • 汎用性と豊富なライブラリ: scapypsutil などのライブラリを使うことで、ネットワークパケットの解析やプロセス情報の取得が容易になります。
  • クロスプラットフォーム: Windows だけでなく、Linux や macOS でも同じようなコードで動作させることができます。
  • 例:
    import psutil
    
    for conn in psutil.net_connections('tcp'):
        if conn.laddr.port == 80:
            print(f"PID: {conn.pid}, Process Name: {psutil.Process(conn.pid).name()}")
    

C++

  • パフォーマンス: 低レベルな操作が可能で、高負荷な処理に適しています。
  • Winsock API: Windows ソケット API を直接利用することで、より細かい制御ができます。
  • 例: Winsock API を用いたソケットの作成、接続情報の取得、プロセス ID の取得など、C# のコードと同様の処理を行います。
  • Java: java.net パッケージを用いてソケットプログラミングを行うことができます。
  • Go: net パッケージを用いて、効率的なネットワークプログラミングが可能です。
  • Ruby: socket ライブラリや psutil gem を使用できます。

外部ツール

  • Process Explorer: GUI ツールで、リアルタイムにプロセスと開いているポートの情報を表示できます。
  • netstatコマンド: コマンドプロンプトや PowerShell で利用できる標準コマンドで、ネットワーク接続情報を表示します。
  • lsofコマンド: Linux/Unix 系のコマンドですが、Windows でも Cygwin などで利用できます。

選択の基準

  • 目的: 単純な確認なのか、高度な制御が必要なのか。
  • 開発環境: 普段使用している言語やツール。
  • パフォーマンス: 処理速度やリソース消費量。
  • クロスプラットフォーム: 複数のOSで動作させる必要があるか。

Windows でポートリスニングプロセスを確認する方法は、非常に多岐にわたります。C# 以外にも、PowerShell、Python、C++ などの様々な言語やツールを用いて実現できます。それぞれの特性を理解し、目的に合った手法を選択することが重要です。

  • セキュリティ: 任意のポートに対してこの処理を実行することは、セキュリティ上のリスクとなる可能性があります。
  • WMI: Windows Management Instrumentation の略で、Windows システムの管理情報を取得するためのインターフェースです。

具体的な選択のポイント:

  • スクリプトで手軽に実行したい: PowerShell
  • 様々なプラットフォームで利用したい: Python
  • 高性能な処理が必要: C++
  • GUI で視覚的に確認したい: Process Explorer

windows networking port

windows networking port

iPhoneアプリ開発のコード例 (Windows環境)

iPhoneアプリの開発は通常、macOSを搭載したMacコンピューターで行われます。しかし、Windowsマシンでも開発が可能になりました。以下は、主な方法です:Apple Developer Programに登録する必要があります。これは、iPhoneアプリの開発に必要な証明書やプロビジョニングプロファイルをダウンロードするために必要です。