3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)現在のユーザが起動した特定のプロセスを終了する

特定のプロセスを終了する方法ですが、ユーザ関係なしに終了するなら、ここにある方法で簡単に行えます。

厄介なのは、これに「特定のユーザー」という条件がついたときです。

(ターミナルサーバで動かす予定なので、ユーザの指定ができないと、ログインしてる全ユーザに影響が出ちゃうので。。)

.Net の Process クラスでは簡単にプロセスを実行しているユーザが取れません。

ということで、WMIを使ってプロセス情報を取得し、ユーザ名を比較する方法をとることにしました。

とりあえず暫定で作ったコードなのできれくはないですが、下記に載せておきます(C#)。

//現在のユーザ名取得

string strUserName = Environment.UserName;

//.Netでプロセス検索。(この時、a.exeだとaだけで構わない。)

Process[] ps =Process.GetProcessesByName("a");

//WMIからプロセス検索

ManagementObjectSearcher query = new ManagementObjectSearcher(@"SELECT * FROM Win32_Process Where Name = 'a.exe'");

ManagementObjectCollection col = query.Get();

 

//配列から1つずつ取り出す

foreach (System.Diagnostics.Process p in ps)

{

foreach (ManagementObject o in col)

{

int pId = int.Parse(o["ProcessId"].ToString());

Object[] UserInfo = new object[2];

o.InvokeMethod("GetOwner", UserInfo);

//現在のユーザ名とプロセスの実行ユーザ名が同じなら殺す

if (p.Id == pId && strUserName.Equals( (string)UserInfo[0] ))

{

p.Kill();

break;

}

}

}

どうせなら、WMI一本だけでプロセス殺した方がシンプルかもしれませんね。

あと、.Net の Process.GetProcessesByName の引数となるプロセス名ですが、".exe" 入らないようです。

ただ、OpenOfficeのように soffice.bin とかいうプロセスの場合は、".bin" も入れないとダメでした。。

参考:

@IT:【C#】プロセス実行ユーザ名称の取得API - Insider.NET