DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

実行されているすべてのプロセスを取得する

Processクラスを使用した方法

ProcessクラスのGetProcessesメソッドを使ってローカルコンピュータ上(リモートコンピュータも可能)で実行されているすべてのプロセスを取得できます。

次の例ではローカルコンピュータ上で実行されているすべてのプロセスを取得し、そのプロセス名などを列挙しています。

VB.NET
コードを隠すコードを選択
'ローカルコンピュータ上で実行されているすべてのプロセスを取得
Dim ps As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses()
'"machinename"という名前のコンピュータで実行されている
'すべてのプロセスを取得するには次のようにする。
'Dim ps As System.Diagnostics.Process() = _
'    System.Diagnostics.Process.GetProcesses("machinename")

'配列から1つずつ取り出す
For Each p As System.Diagnostics.Process In ps
    Try
        'プロセス名を出力する
        Console.WriteLine("プロセス名: {0}", p.ProcessName)
        'ID
        Console.WriteLine("ID: {0}", p.Id)
        'メインモジュールのパス
        Console.WriteLine("ファイル名: {0}", p.MainModule.FileName)
        '合計プロセッサ時間
        Console.WriteLine("合計プロセッサ時間: {0}", p.TotalProcessorTime)
        '物理メモリ使用量
        Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet64)
        '.NET Framework 1.1以前では次のようにする
        'Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet)

        Console.WriteLine()
    Catch ex As Exception
        Console.WriteLine("エラー: {0}", ex.Message)
    End Try
Next
C#
コードを隠すコードを選択
//ローカルコンピュータ上で実行されているすべてのプロセスを取得
System.Diagnostics.Process[] ps =
    System.Diagnostics.Process.GetProcesses();
//"machinename"という名前のコンピュータで実行されている
//すべてのプロセスを取得するには次のようにする。
//System.Diagnostics.Process[] ps =
//    System.Diagnostics.Process.GetProcesses("machinename");

//配列から1つずつ取り出す
foreach (System.Diagnostics.Process p in ps)
{
    try
    {
        //プロセス名を出力する
        Console.WriteLine("プロセス名: {0}", p.ProcessName);
        //ID
        Console.WriteLine("ID: {0}", p.Id);
        //メインモジュールのパス
        Console.WriteLine("ファイル名: {0}", p.MainModule.FileName);
        //合計プロセッサ時間
        Console.WriteLine("合計プロセッサ時間: {0}", p.TotalProcessorTime);
        //物理メモリ使用量
        Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet64);
        //.NET Framework 1.1以前では次のようにする
        //Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet);

        Console.WriteLine();
    }
    catch (Exception ex)
    {
        Console.WriteLine("エラー: {0}", ex.Message);
    }
}

このコードは、64ビット環境で実行すると、Process.MainModuleプロパティを呼び出す箇所で、エラーが発生(例外Win32Exceptionをスロー)します。これを防ぐには、プラットフォームターゲットを「Any CPU」か「x64」にするか、下で紹介する方法を使います。

WMIを使用する方法

WMIのWin32_Processクラスを使ってもすべてのプロセスを取得できます。

WMIはWindows 2000以上のOSで使用できます。また、以下のサンプルではSystem.Management.dllを参照設定に追加する必要があります。

VB.NET
コードを隠すコードを選択
Dim mc As New System.Management.ManagementClass("Win32_Process")
Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances()
Dim mo As System.Management.ManagementObject
For Each mo In moc
    Console.WriteLine("プロセス名:{0}", mo("Name"))
    Console.WriteLine("プロセスID:{0}", mo("ProcessId"))
    Console.WriteLine("ファイル名:{0}", mo("ExecutablePath"))

    mo.Dispose()
Next

moc.Dispose()
mc.Dispose()
C#
コードを隠すコードを選択
System.Management.ManagementClass mc =
    new System.Management.ManagementClass("Win32_Process");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
    Console.WriteLine("プロセス名:{0}", mo["Name"]);
    Console.WriteLine("プロセスID:{0}", mo["ProcessId"]);
    Console.WriteLine("ファイル名:{0}", mo["ExecutablePath"]);

    mo.Dispose();
}

moc.Dispose();
mc.Dispose();
  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2010/9/21 VB.NETのコードのコメントが、C#のものになっていたのを修正。
  • 2011/7/6 VB.NETのコードのコメントが、C#のものになっていたのを修正。
  • 2013/7/8 WMIを使用する方法を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。