🗿

[C#/WMI] WMIで、全プロセスのCPU時間やメモリ使用量をとる

2021/08/25に公開

もくじ
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

やりたいこと

以前の記事で、あるプロセスのCPU時間を取ったが、今度は全プロセスのCPU時間を取りたい。ついでにメモリ使用量もとりたい。

やり方

「Win32_Process」 をつかう。

サンプルコード

using System;
using System.Management;//System.Management.dllを参照に追加

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");

            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process");

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
            
            using (ManagementObjectCollection queryCollection = searcher.Get())
            {
                foreach (ManagementObject m in queryCollection)
                {
                    // WMIオブジェクトのプロパティを取得して表示
                    Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}", m["ProcessId"], m["Name"], m["KernelModeTime"], m["UserModeTime"], m["WorkingSetSize"], m["ExecutablePath"], m["Description"]);

                    m.Dispose();
                }
            }

            searcher.Dispose();

            Console.ReadLine();
        }
    }
}

結果


こんな感じで、プロセスの情報が全部ダーっととれる。

そのプロセスの「親のPID」も取れるので、それを使ってプロセスの親子関係を調べることもできそう。(プロセスツリー的なものも作れるかも)

別解

using (ManagementClass managementClass = new ManagementClass("Win32_Process"))
{
    managementClass.Get();

    using (ManagementObjectCollection managementObjectCollection = managementClass.GetInstances())
    {
        foreach (ManagementObject m in managementObjectCollection)
        {
            Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}", m["ProcessId"], m["Name"], m["KernelModeTime"], m["UserModeTime"], m["WorkingSetSize"], m["ExecutablePath"], m["Description"]);
            m.Dispose();
        }
    }
}

Discussion