とあるC#で書いているツールでプロセスIDからそのプロセスのオーナーを取得する必要が出てきました。自分のプロセスであれば比較的容易に取得できますが、他プロセスの情報となると難しくなります。そこで、WMI .NET を利用してプロセスの一覧とそのオーナーを取得することにしました。
リンク先にあるように、System.Management 名前空間を参照します。
あとはこんな感じで、Win32_Process クラス.aspx)をインスタンス化し、ManagementClass.GetInstances メソッド (System.Management) でプロセス一覧を取得します。
foreach文で変数の型をManagementObject と指定しているのはキャストするためです。ここからプロセスのオーナーを取得するには、ManagementObject.InvokeMethod メソッド (System.Management) を使って GetOwner メソッドを実行します。
あとはこれを「管理者権限」で実行します。管理者権限がないと、自分以外のオーナーは取得できないようです。
さて、最初のプロセスIDを指定してそのオーナーを取得、であればこんな感じでしょうか。
ManagementObjectCollection が非GenericなIEnumerable なのでCast しているのと、ProcessIdがuint型であるのが注意点です。
こんな感じで便利なWMI .NET ですが、制限事項もあるのでご利用の際は注意してください。