[Win32]プロセス一覧を取得する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たろ

[Win32]プロセス一覧を取得する方法

#1

投稿記事 by たろ » 14年前

お世話になってます。発言は少ないですがいつも見させてもらっています。
新掲示板の移行が無事に終わることを祈ってます。もうすぐ移行なのにすみませんが・・

タスクマネージャの「プロセス」タブのような、システムのプロセス一覧を得るアプリを作ろうとしています。
自身以外のプロセスを閲覧する権限について、わからない点があり投稿させて頂きました。

環境:WinXP Home SP3, VC2008Express, BCC5.5.1, Win32API

経緯:PCで、スクリーンセーバー中にファンの音が大きくなり(何かプログラムがCPUを使っている感じ)、
スクリーンセーバー解除するとファンの音が小さくなる・・という現象が起き、何だか気持ち悪いので、
プロセス毎のCPU使用率を記録しつづけて、後から確認できるプログラムを作りたいと思いました。

このページなどを参考に、
http://support.microsoft.com/kb/175030/ja

PSAPI関数やToolhelp32関数を使ってプロセス一覧を取得・表示するプログラムを作ってみました。
ソースファイル PSAPI.c と Toolhelp32.c を添付します。

問題は、一部のプロセスでプロセスモジュールパス(EXEフルパス)が取得できない事です。
OpenProcess() や CreateToolhelp32Snapshot() が ERROR_ACCESS_DENIED(5) エラーになります。
例えばタスクマネージャ中の以下のプロセスです。

0 System Idle Process
4 System
352 igfxext.exe
620 svchost.exe
792 csrss.exe
2268 alg.exe

最初の2つはまあしょうがないか・・と思います。
ですが、その他は取得する方法があるように思うのですが、その方法がわかりません。

フリーソフトの「ProcessWalker」は、ちゃんと取得できているように見えます。

また「straceNT」(API呼び出しを監視するソフト)経由で自作プログラムを実行すると、
なぜか取得できなかったプロセスの情報が取得できるようになります。

単純にPSAPI関数やToolhelp32関数を使うだけでは、自身以外のプロセスを閲覧する権限が弱い?
ような感触があります。OSのログインアカウントはAdministrator権限がありますが、その他に
「プロセス毎の権限」のようなものがあるのでしょうか?

キーワード「Win32 プロセス 権限 API」などでネット検索してみましたが、有用な情報を
見つけられませんでした。

もう少し強い権限でプログラムを動作させる方法があるのでしょうか?
よろしくお願いいたします。

ISLe

Re:[Win32]プロセス一覧を取得する方法

#2

投稿記事 by ISLe » 14年前

"OpenProcess 特権"で検索するとサンプルプログラムや解説が見付かると思います。

たろ

Re: [Win32]プロセス一覧を取得する方法

#3

投稿記事 by たろ » 14年前

ISLeさん、いつもお世話になります。ありがとうございます。

頂いたヒントをもとに、見よう見まねで SE_DEBUG_NAME トークンを有効にしてみたところ、
「System Idle Process」「System」を除く全プロセスのEXEパスが取得できました!
ありがとうございました。

このページのサンプルコードを使わせてもらいました。
http://eternalwindows.jp/security/secur ... ext05.html

「トークン」や「UAC」など、今回はじめて断片的に知りましたが、すごく複雑な仕組みですね・・。
今回の私の目的のために SE_DEBUG_NAME を有効にすることが適切なのか?謎ではありますが、
とりあえず動いたしまあいいか。。

質問の問題点は解消しましたので、解決とさせていただきます。
ありがとうございました。m(_ _)m

・・あれ?新掲示板には解決チェックはないのですね・・。

閉鎖

“C言語何でも質問掲示板” へ戻る