【C#】親プロセスのプロセスIDを取得する(祖父プロセスIDも)

C#

バッチファイルで自身のプロセスIDを調べようと思うと確実な方法がないので、バッチファイルから呼び出されるコマンド側でプロセスIDが取得できないかと調べました。出来そうな方法が見つかったので紹介します。

サンプルコード

準備

プロジェクトの参照に System.Management を追加しておく必要があります。

親プロセスを取得するサンプルコード

このサンプルでは、WMI(Windows Management Instrumentation)を利用して、Win32_Process WMI クラスから ParentProcessId プロパティを問い合わせることにより、現在のプロセスIDから親プロセスIDを特定しています。

using System;
using System.Diagnostics;
using System.Management;

class Program
{
    static void Main()
    {
        int parentPid = 0;
        int currentPid = Process.GetCurrentProcess().Id;
        string query = "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = " + currentPid;
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", query);

        foreach (ManagementObject obj in searcher.Get())
        {
            parentPid = Convert.ToInt32(obj["ParentProcessId"]);
        }

        Console.WriteLine("Parent Process ID: " + parentPid);
    }
}

祖父プロセスを取得するサンプルコード

上記を繰り返せば、祖父プロセスのIDも取得できるようです。

using System;
using System.Management;

class Program
{
    static int GetParentProcessId(int processId)
    {
        string query = "SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = " + processId;
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", query);
        foreach (ManagementObject obj in searcher.Get())
        {
            return Convert.ToInt32(obj["ParentProcessId"]);
        }
        return -1; // 親プロセスが見つからない場合
    }

    static void Main()
    {
        // 現在のプロセスIDを取得
        int currentProcessId = System.Diagnostics.Process.GetCurrentProcess().Id;
        
        // 親プロセスのIDを取得
        int parentProcessId = GetParentProcessId(currentProcessId);
        Console.WriteLine("Parent Process ID: " + parentProcessId);
        
        // 親プロセスの親(祖父プロセス)のIDを取得
        if (parentProcessId != -1)
        {
            int grandparentProcessId = GetParentProcessId(parentProcessId);
            Console.WriteLine("Grandparent Process ID: " + grandparentProcessId);
        }
    }
}

プロセスチェーンをさらに遡りたい場合は、この手順を必要なだけ繰り返すことで実現できます。ただし、プロセスツリーの全てのプロセスが存在し、アクセス可能である必要があります。セキュリティ制限やプロセスの終了などにより、プロセス情報が取得できない場合がありますので、その点を考慮する必要があります。

まとめ

本記事では、C#を使用し、あるプロセスの親のプロセスIDを取得する方法を紹介しました。

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