「ほっ」と。キャンペーン
(.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
[PR]
by jehoshaphat | 2010-06-13 11:59 | .Net開発 | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/12795987
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


<< (ネットワーク)MACアドレス... (ActiveDirector... >>