こんにちは.
現在WindowsNT4.0,及びW2Kにて動作するプログラムを作成してます.
プログラムは,稼動している"全て"のプロセス名を列挙するというものです.
現在のプログラムは以下のような流れになっております.
(1)EnumProcesses()でプロセスID取得
(2)OpenProcess()でプロセスのハンドル取得
(3)GetModuleBaseName()もしくは,GetModuleFileNameEx()でプロセス名取得
しかし,(2)のOpenProcessでアクセス権の無いプロセスのハンドルが取得できない為,(3)でのプロセス名取得に失敗します.(たとえば,systemやCSRSS.EXEなど)
これらのプロセス名を取得する何か良い方法はあるでしょうか?
(プロセスに対しては,名前を取得するだけで他の操作は行いません.)
※OpenProcess()の解説などを見ても「適切なアクセス権が無いと失敗します」といった記述があるだけで,具体的にどういった権限が必要なのかが分かりません.
何かヒントでもよいので,知っておりましたら教えていただけないでしょうか?
宜しくお願いします.
プロセスの列挙はしたことがないですが……。
> しかし,(2)のOpenProcessでアクセス権の無いプロセスのハンドルが取得できない為,(3)でのプロセス名取得に失敗します.(たとえば,systemやCSRSS.EXEなど)
OpenProcessの第一引数をPROCESS_QUERY_INFORMATIONにしてもダメですか?
最悪,CreateProcessAsUserで別のユーザー(SYSTEMなど)になりすまして取得してみるとか。
#これでダメならまず無理でしょう。
> ※OpenProcess()の解説などを見ても「適切なアクセス権が無いと失敗します」といった記述があるだけで,具体的にどういった権限が必要なのかが分かりません.
プロセスオブジェクトにアクセスする権限ですから,
オブジェクトのDACLにOpenProcessの実現に必要な権利を有する,
というか与えられていないと失敗します。
NTFSでアクセス権の一切無いファイルを開こうとしても開けないのと同じような状況です。