【C#】プロセスの一覧とコマンドライン情報を取得する


この記事はプロモーションを含みます。

C#で、Windowsの実行中のプロセス一覧とコマンドラインの情報を取得する方法を解説します。

はじめに・事前準備

本記事では、実行中のプロセス名とコマンドライン情報の一覧を取得する方法を説明します。
コンソールアプリケーションとして作成するので、実行する際はコマンドプロンプトを使います。

今回は、System.Management アセンブリを使用するため、事前準備として、NuGetパッケージマネージャーで以下のコマンドを実行してSystem.Management パッケージをインストールしておきます。

Install-Package System.Management

これで、System.Management 名前空間を利用できるようになります。

ソースコード

プロセス情報を取得するソースコードです。
ポイントとしては、以下の3点となります。

  • Process.GetProcesses() を使用して、実行中のすべてのプロセスを取得します。
  • 各プロセスに対して、ProcessName でプロセス名を取得します。
  • GetCommandLine メソッドで、WMI(Windows Management Instrumentation)を利用してプロセスIDからコマンドラインを取得します。
using System.Diagnostics;
using System.Management;

class Program
{
    static void Main()
    {
        // 実行中のプロセスを取得
        Process[] processes = Process.GetProcesses();

        foreach (Process process in processes)
        {
            try
            {
                // プロセス名を取得
                string processName = process.ProcessName;

                // コマンドラインを取得
                string commandLine = GetCommandLine(process.Id);

                Console.WriteLine($"プロセス名: {processName}, コマンドライン: {commandLine}");
            }
            catch (Exception ex)
            {
                // 一部のプロセスは情報へのアクセスが制限されているため、エラーを無視する
                Console.WriteLine($"エラー: {ex.Message}");
            }
        }
    }

    // プロセスIDからコマンドラインを取得する
    static string GetCommandLine(int processId)
    {
        try
        {
            using Process process = Process.GetProcessById(processId);

            // プロセスのコマンドライン情報を取得
            string query = $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {processId}";
            ManagementObjectSearcher searcher = new(query);
            ManagementObjectCollection collection = searcher.Get();

            foreach (var obj in collection)
            {
                return obj["CommandLine"]?.ToString() ?? string.Empty;
            }
        }
        catch (Exception)
        {
            // コマンドライン情報が取得できない場合は空文字を返す
            return string.Empty;
        }
        return string.Empty;
    }
}

実行例

コマンドプロンプトで実行したイメージです。
出力情報量が多いのでかなり省略していますが、以下のように出力されます。

環境にもよりますが、出力情報量が多くなると思うので、テキストなどにリダイレクトしつつ実行する方が良いかなと思います。

C:\Workspace>ConsoleApp1.exe
プロセス名: Idle, コマンドライン:
プロセス名: System, コマンドライン:
プロセス名: svchost, コマンドライン: C:\WINDOWS\system32\svchost.exe -k UnistackSvcGroup -s CDPUserSvc
プロセス名: explorer, コマンドライン: C:\WINDOWS\Explorer.EXE

コメント

タイトルとURLをコピーしました