- PR -

【C#】プロセス実行ユーザ名称の取得API

1
投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2005-04-14 11:44
いつもお世話になっております。

ご存知の方、いらしたら教えてください。

プロセス名を指定して、そのプロセスの実行ユーザ名を取得するAPIって
あるんでしょうか?

System.Environment.UserNameで自プロセスのユーザ名を取得できるし、
System.Diagnostics.Process.GetProcessesByNameで実行中のプロセス一覧を取得できることはわかりました。

しかし、プロセス名を指定して、他プロセスの実行ユーザ名を取得するAPIが
見つかりません...
タスクマネージャで表示しているので、あると思うんですが...
Processクラスのメンバでありそうな気がしたケド、駄目でした。

以上、よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-04-14 12:13
引用:

プロセス名を指定して、そのプロセスの実行ユーザ名を取得するAPIって
あるんでしょうか?



無いです。

WMI = System.Management 名前空間配下のクラスを使って、間接的に取得できたかもしれません。

それでだめなら Windows API を呼び出すことになるでしょう。

基本的に、.NET では他のプロセスにちょっかいを出すのは手間がかかるようになっています。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2005-04-14 13:47

>無いです。

回答ありがとうございます。
やっぱりないんですね。なんとなく、そんな気はしてたんですが...

System.Management 名前空間配下のクラスも調べてみましたが、
それらしいのが見当たらない
(というか、MSDNのクラス説明文が抽象的過ぎて何のクラスかよくわからない...)
のでWin32APIを探してみます。

回答ありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-04-14 15:08
引用:

System.Management 名前空間配下のクラスも調べてみましたが、
それらしいのが見当たらない



プロセスを扱うなら、Win32_Process クラス以外の線は薄いかと (^^;

Win32_Process.GetOwner() でプロセスオーナーのユーザー名が取得できるようです。

http://www.users.gr.jp/blogs/hidori/archive/2005/01/14/7385.aspx

に、WMI を使ってプロセス一覧を取得するサンプルを置いてあるので、これを少し改造すれば目的は達せられるんじゃないでしょうか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2005-04-14 18:43
度々、回答ありがとうございます。
前述のURLのコードを参考にさせて頂き、下記のようなコードで取得できました。
(いまいち、自信ないですが...)
あとは、シンクライアント環境で、正しく動作することを祈るだけです。

【コード例】

ManagementScope scope = new ManagementScope (@"\\\\.\\ROOT\\CIMV2");

scope.Connect();
ObjectQuery query = new ObjectQuery (@"SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher = new ManagementObjectSearcher (scope, query);
ManagementObjectCollection col = searcher.Get();
foreach (ManagementObject o in col )
{
string pid = o ["ProcessId"].ToString();
string name = o ["Name"].ToString();

Object[] UserInfo = new object[2];
o.InvokeMethod("GetOwner", UserInfo);

string UserName = (string)UserInfo[0]; //実行ユーザ名称取得
string DomainName = (string)UserInfo[1]; //実行ユーザのドメイン名称取得
}

回答ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)