特定のプロセスを終了する方法ですが、ユーザ関係なしに終了するなら、ここにある方法で簡単に行えます。
厄介なのは、これに「特定のユーザー」という条件がついたときです。
(ターミナルサーバで動かす予定なので、ユーザの指定ができないと、ログインしてる全ユーザに影響が出ちゃうので。。)
.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" も入れないとダメでした。。
参考: