コマンドライン引数付きのプロセス一覧
WSH やバッチを使った本番運用なぞしている時は、cmd.exe や CScript.exe のプロセスに渡されている引数や実行している .vbs が何かがわからないと困る。
もう先週の事だが、職場で同僚のOさんに「プロセス一覧にコマンドライン引数を表示するような API を知らないか」と聞かれた。
知らない。
そのような一覧を表示できるGUIのフリーソフトはあるが、やはり標準出力でリダイレクトしたテキストファイルとして欲しいところである。
わざわざ C++ で作らなくとも WSH + Win32_Process で持って来れないか、と考えたが、Oさんに教えてもらったプロパティリストを見たところ、commandlineプロパティは XP でしか使えない。残念ながら、普段使うOSは Windows2000 である。
となると、psapi (もしくは ntdll )を使って自分で作るしかあるまい。
そんなソフトがあれば、ボク的には今後、結構重宝しそうだ。
と、言う事で調べ始めた。隠しAPIだけあって、なかなか参考となる資料が見つからなかったが、2つの解法を得た。
まず、見つかったのは msdn のサンプル。しかしこれは、VC++ で MFC要。
もちろん「それでいーじゃん」と言う人は、これでいい。
今の職場でのみ、使うのであれば、ボクもこれでいいと思う。
でも、仕事と関係なく、汎用的に使いたい。そうなると、VC++ は、フリーの Toolkit しか持っていないボクには厳しいのだ。
で、codeproject.com で、ようやく現状での、最適解を得る事ができた。
答えは「 psapi (もしくは ntdll )の関数では持って来れない!」だ。
じゃ、どーやるか、はサンプルコードを見ていただくとして、元記事を書いた人曰く「ちゃんと実装しないと元プロセスごと逝っちゃうよ」との事。
で、ヘタレなボクとしては、こんな風に作ってみた。コンパイラは例によって bcc32 です。
Usage: pslistc [ exeName1 [ exeName2 [...] ] ]
・引数なしで実行した時は、pid と GetModuleBaseName で得たEXE名のみ表示
・引数にEXE名を指定した場合は、当該のプロセスのみコマンドライン引数も表示
中途半端な小物だけど、微妙に便利かもしれない。(ボク的にはね)
気が向いたら Works の方に上げます。
さて、これをお読みの皆さんで「んな、めんどくさい事しなくても、psapi (もしくは ntdll )の、この関数使えばいーんだよ、このタコが!」と言う最適解をお持ちの方は、是非是非コメントください。
(EXEのフルパスじゃないよ。「コマンドラインの引数すべて」が欲しいんです)
[msdn] VC++ と MFC でプロセス一覧
[codeproject] 今回参考にした元記事
[sample code] 上記のサンプルコード
« カーベー・ケージとモンプティシュ | トップページ | DUAL FEEL »
コメント
この記事へのコメントは終了しました。
こんな感じで・・・
自分も困ったことがあるので、情報の共有です。
--------------------
strComputer = "." ' ドット (.) は WMI のローカル コンピュータを表します。
Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Process")
For Each wbemObject In wbemObjectSet
WScript.Echo "名前: " & wbemObject.Name & vbCrLf & _
" ハンドル: " & wbemObject.Handle & vbCrLf & _
" プロセス ID: " & wbemObject.ProcessID
Next
--------------------
node[powered by Kenji]
投稿: node[powered by Kenji] | 2005/05/25 12:37
コメントありがとうございます。
ええ、ここまではわかるんですよ。
欲しいのは「コマンドラインの引数すべて」
なんですね。
で、XPだとcommandline取れるんですが、
W2Kで可能でないかな、と。
投稿: こぢゃ | 2005/05/28 10:24
同じ問題で悩んでおり、参考になる記事として読ませていただきました。
当記事のサンプルコードのリンクが切れているので、再アップをお願いします。。
投稿: | 2008/10/27 11:55
コメントありがとうございます。
Window2000をお使い、と言う事でしょうか?
XP以降なら、WSH + Win32_Process で commandlineプロパティを使うのが最もお手軽、かつサンプルもその辺に転がっていると思います。
アプリとして作りたいのなら、Visual Studioがあるなら、MSDNの方でもよいのでは?
また、codeprojectのサンプルもログイン(無料だったはず)すれば落とせます。
リンク切れのmoliate氏のソースは上記のエッセンスだけを抜き出した数10行のコードですが、とは言え、勝手にアップはできないのでご勘弁ください。
(と言うか、もう原本が手元にありません)
自分のタコソースをここで晒すのはもっと勘弁と言う事で御容赦w
投稿: こぢゃ | 2008/10/30 00:03