銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

C# で WMI を使って実行中プロセスの一覧とそのオーナーを取得する

とあるC#で書いているツールでプロセスIDからそのプロセスのオーナーを取得する必要が出てきました。自分のプロセスであれば比較的容易に取得できますが、他プロセスの情報となると難しくなります。そこで、WMI .NET を利用してプロセスの一覧とそのオーナーを取得することにしました。

WMI .NET の概要

リンク先にあるように、System.Management 名前空間を参照します。

f:id:tanaka733:20141004210613p:plain

あとはこんな感じで、Win32_Process クラス.aspx)をインスタンス化し、ManagementClass.GetInstances メソッド (System.Management) でプロセス一覧を取得します。

foreach文で変数の型をManagementObject と指定しているのはキャストするためです。ここからプロセスのオーナーを取得するには、ManagementObject.InvokeMethod メソッド (System.Management) を使って GetOwner メソッドを実行します。

GetOwner method of the Win32_Process class (Windows)

あとはこれを「管理者権限」で実行します。管理者権限がないと、自分以外のオーナーは取得できないようです。

さて、最初のプロセスIDを指定してそのオーナーを取得、であればこんな感じでしょうか。

ManagementObjectCollection が非GenericなIEnumerable なのでCast しているのと、ProcessIdがuint型であるのが注意点です。

こんな感じで便利なWMI .NET ですが、制限事項もあるのでご利用の際は注意してください。

.NET Framework の WMI の制限事項