バッチファイルで自身のプロセス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を取得する方法を紹介しました。