[WMI] 簡単にメソッド検証可能なニクいやつ、その名は妖怪人間 “wbemtest”を使ってみる

みなさんごきげんよう。ういこです。
最近不調で、Blog 更新もあまりしておらずすみません。今日は、wbemtest ちゃんの簡単クッキングをご紹介いたします。
technet、Scripting Eye for the GUI Guy などでハードコピーつきでかなり詳しく説明されていますが、私のような朝のあわただしい中も、とっとと可及的速やかに WMI の結果を見たいのよという主婦の皆様も主夫の皆様も、ちと、絵が足りないんじゃないかと思いましたので、今更ジロー好きならジローというわけで今回の記事と相成りました。

wbemtest、まずこれ皆さんなんて読まれますか?
う ぇ ぶ べ む て す と って呼ぶらしいですのよ奥様。
私は、technet も Scripting Eye for the GUI Guy もブッちぎって、「ダブルベムテスト」と呼ばわってました。一家もダブルベム派です。それとも、気づいていたけど私に気を使っていた…とか…?

それはさておき、WMI Code Creator など、素敵なツールがあるので、普段ちょいとメソッドの動作を確認する際は重宝していたんですが、いちいちスクリプトを保存して、コマンドプロンプトを立ち上げるなんてとっとと動作確認をしたいときなんてバリ不便です。というわけで、なんかいい方法ないのかしらドラ○もん~と転げまわっていたところ、ぴろとくんが簡単に使い方をレクチャーしてくれました!
そう、そうなのよ、情報がテンコ盛りなリファレンスもいいけど、さっとできる手順がほしかったのよ!というわけです。

Windows Management Instrumentation テスト (wbemtest) を使ってメソッドの実行をやってみよう! 例 1 : Win32_Printer の GetSecurityDescriptor() メソッドを実行する

特定のプリンターの SecurityDescriptor を取得するメソッドですね。
こいつをスクリプトで実施するとこんな感じです。

<-- コード例ここから
Set objWMIService = GetObject("winmgmts:")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer")

For Each objPrinter in colInstalledPrinters
If objPrinter.Name = PrinterName Then
' Get security descriptor for printer
Return = objPrinter.GetSecurityDescriptor( objSD )

If ( return <> 0 ) Then
WScript.Echo "Could not get security descriptor: " & Return
wscript.Quit Return
End If
<-- ここまで

これを、notepad などで拡張子 vbs にして、コマンド プロンプト上で実行させるなんて、結構手間でしょう?!私は面倒くさいなと思います。
というわけで、いよいよニクいアイツ -- そう、wbemtest ちゃんを使ってみようではないですか。

1. [スタート] ボタンから、wbemtest を検索します。"プログラム" の検索結果が表示され、wbemtest が候補になります。
Vista の場合 : この時点でアイコンを右クリックし、"管理者として実行(A)" を選択します。ユーザーアカウント制御 (UA) を構成されている環境では、権限昇格を求めるダイアログ ボックスが表示されますので、[続行(C)] を押してください。

clip_image002
2. Windows Management Instrumentation テスト (wbemtest) ダイアログが開きます。
[接続…] ボタンを押します。この時点では、"IWbemServices" コンテナ配下のボタンは [コンテキストの編集(T)…] 以外、すべてグレーアウトしてしまっていますが、気にしないでください。

clip_image002[4]
3. 既定では、名前空間 root\cimv2 が指定されています。そのまま [接続] をクリックします。"IWbemServices" コンテナ配下のボタンが有効になります。

clip_image002[6]

ここで、[クラスの列挙(E)] ボタンを押します。"スーパークラス情報" ダイアログが表示されますので、左下方ラジオ ボタンのうち "再帰" を選択し、[OK] を押します。再帰を選ばないと、クラスが全部出てきません。もう、ここは、無心に「再帰」で。再び帰るんです。再び。
クエリが実行されます。左上が [操作は実行中です…] から、[完了] になるまでお待ちください。

clip_image002[8]clip_image002[10]

完了すると右上 "操作は実行中です…" が "完了" になります。

clip_image002[12]clip_image002[14]
4. クエリ結果のうち、Win32_Printer をダブルクリックします。
※ 注意 : [追加(A)] ボタンは押さないでください。

clip_image002[16]
5. "Win32_Printer のオブジェクト エディタ"が表示されますので、中央 "プロパティ" テキスト ボックスをスクロールしていただき、__PATH を選択し、[インスタンス] ボタンを押します。

clip_image002[19]
6. クエリが実行され、Win32_Printer のインスタンスが列挙されます。

clip_image002[21]
7. 上記 6. にて列挙されたインスタンスのうち、アクセス権を変更する対象のプリンタを選択し、ダブルクリックします。選択したプリンタ オブジェクトの "オブジェクト エディタ" に画面が変わります。そこで、_PATH を選択した状態で [プロパティの編集] ボタンを押します。

clip_image002[23]
8. プロパティ エディタが開きます。中央 "値" フィールドの値をコピーすることができます。この値に表示されているデータのうち、<コンピュータ名>\root\cimv2: 以降の "Win32_Printer.DeviceID=" から先をコピーします。こいつがメソッドの引数になるです。
例 : \\UIKOUVISTA\root\cimv2:Win32_Printer.DeviceID="Microsoft XPS Document Writer" の場合
Win32_Printer.DeviceID="Microsoft XPS Document Writer" までをコピー

clip_image002[25]
9. コピー後は、[キャンセル] ボタンを押し、選択したプリンタ オブジェクトの "オブジェクト エディタ" に画面を戻します。
10. 選択したプリンタ オブジェクトの "オブジェクト エディタ" では、[閉じる(C)] を選択し、Win32_Printer のインスタンスのクエリ結果に戻ります。また、[閉じる(C)] を押し、"Win32_Printer のオブジェクト エディタ" に戻ります。
11. "Win32_Printer のオブジェクト エディタ" でも、[閉じる(C)] を押します。実行状況によっては、さらに画面がある場合もあります。[閉じる(C)] を押し、最初の "Windows Management Instrumentation テスト" まで戻ってください。
12. "Windows Management Instrumentation テスト" にもどりましたら、[メソッドの実行(X)] を押します。

clip_image002[27]
13. "オブジェクト パスの取得" ダイアログが表示されます。[オブジェクト パス] には、上記 8. にてコピーした Win32_Printer.DeviceID="Microsoft XPS Document Writer" といった値を入力し、[OK] を押します。

clip_image002[29]
14. "メソッドの実行" ダイアログが開きますので、[メソッド :] ドロップダウン リストを、 "GetSecurityDescriptor" に選択し、[実行] ボタンを押します。この時点では、右下の [Out パラメータの編集…] ボタンはグレーアウトしています。

clip_image002[31]
15. "メソッドが実行されました" 旨のメッセージが表示されたことを確認してください。

clip_image002[33]
16. "メソッドの実行" ダイアログが表示されましたら、右下の [Out パラメータの編集…] ボタンが有効になりますので、クリックします。

clip_image002[35]
17. "_PARAMETERS のインスタンス" ダイアログが開きます。同ダイアログ中央 "プロパティ" をスクロールして、ReturnValue を確認します。
正常な場合 … 0x0 で値が返却されます。

clip_image002[37]

エラーの場合は、十進数と 0x… で始まるおなじみのコードが ReturnValue に表示されます。

clip_image002[39]

例 2 : Win32_Process の GetOwner() メソッドを実行する
では、次にもちっと沢山 Out パラメータを取得するようなメソッドでもやってみましょうか。次は、文字通り Process のオーナーを調べるメソッド、Win32_Process の GetOwner() です。

1. から 3. までは例 1 と共通です。
4. クエリ結果のうち、Win32_Process をダブルクリックします。
※ 注意 : [追加(A)] ボタンは押さないでください。

clip_image002[41]

5. "Win32_Process のオブジェクト エディタ" が表示されますので、[インスタンス] ボタンを押します。
6. Win32_Process の Handle プロパティが列挙されます。これは、タスク マネージャに表示される PID (プロセス ID) と等価です。

clip_image002[43]

clip_image002[45]
7. 上記 6. にて列挙されたインスタンスのうち、オーナーを確認する対象のプロセスのハンドルを選択し、ダブルクリックします。選択したハンドル オブジェクトの "オブジェクト エディタ" に画面が変わります。そこで、_PATH を選択した状態で [プロパティの編集] ボタンを押します。

clip_image002[49]
8. プロパティ エディタが開きます。中央 "値" フィールドの値をコピーすることができます。この値に表示されているデータのうち、<コンピュータ名>\root\cimv2: 以降の "Win32_Process.Handle" から先をコピーします。こいつがメソッドの引数になるです。
例 : \\UIKOUVISTA\root\cimv2:Win32_Process.Handle="4328" の場合
Win32_Process.Handle="4328" までをコピー

clip_image002[51]

clip_image002[53]
9. コピー後は、[キャンセル] ボタンを押し、選択したハンドル オブジェクトの "オブジェクト エディタ" に画面を戻します。

10. 選択したハンドル オブジェクトの "オブジェクト エディタ" では、[閉じる(C)] を選択し、Win32_Process のインスタンスのクエリ結果に戻ります。また、[閉じる(C)] を押し、"Win32_Printer のオブジェクト エディタ" に戻ります。
11. "Win32_Printer のオブジェクト エディタ" でも、[閉じる(C)] を押します。実行状況によっては、さらに画面がある場合もあります。[閉じる(C)] を押し、最初の "Windows Management Instrumentation テスト" まで戻ってください。
12. "Windows Management Instrumentation テスト" にもどりましたら、[メソッドの実行(X)] を押します。
13. "オブジェクト パスの取得" ダイアログが表示されます。[オブジェクト パス] には、上記 8. にてコピーした Win32_Process.Handle="4328" を入力し、[OK] を押します。
14. "メソッドの実行" ダイアログが開きますので、[メソッド :] ドロップダウン リストを、 "GetOwner" に選択し、[実行] ボタンを押します。この時点では、右下の [Out パラメータの編集…] ボタンはグレーアウトしています。

clip_image002[55]
15. "メソッドが実行されました" 旨のメッセージが表示されたことを確認してください。
16. "メソッドの実行" ダイアログが表示されましたら、右下の [Out パラメータの編集…] ボタンが有効になりますので、クリックします。
17. "_PARAMETERS のインスタンス" ダイアログが開きます。同ダイアログ中央 "プロパティ" をスクロールして、ReturnValue を確認します。
正常な場合 … それぞれ、以下のように Domain / ReturnValue / User がはいります。例によって、ReturnValue が 0x0 ならば正常終了でございます。

clip_image002[57]

参考 : WMI Code Creator を使った場合
WMI Code Creator 様からのご託宣は以下です。

clip_image002[59]

<-- ここから
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
' Obtain an instance of the the class
' using a key property value.
Set objShare = objWMIService.Get("Win32_Process.Handle='4328'")

' no InParameters to define

' Execute the method and obtain the return status.
' The OutParameters object in objOutParams
' is created by the provider.
Set objOutParams = objWMIService.ExecMethod("Win32_Process.Handle='4328'", "GetOwner")

' List OutParams
Wscript.Echo "Out Parameters: "
Wscript.echo "Domain: " & objOutParams.Domain
Wscript.echo "ReturnValue: " & objOutParams.ReturnValue
Wscript.echo "User: " & objOutParams.User
<-- ここまで

実行結果 :
Out Parameters:
Domain: FAREAST
ReturnValue: 0
User: uikou

clip_image002[61]

**********

WMI Code Creator 様も併用すると、WMI セレブ気分を味わえます。もう、スクリプトをいちいち組む必要が(わりと)減るかも!というわけで、素敵な WMI ライフをご満喫ください。

ういこう@ブロカリ=ブロッコリーとカリフラワーがいい意味で悪魔合体した野菜はうまかっただす。