HSPでWMIの各種情報を取得(名前空間、クラス名、プロパティ)

1.概要

Windows Management Instrumentation (WMI) は、Windows Driver Modelへの拡張の一種で、システムの構成要素について 情報収集と通知を行うオペレーティングシステムのインタフェースを提供するものです。今回、このWMIをHSPスクリプトにて 名前空間やクラス名およびプロパティなどのリストを取得したいと思います。PowerShellなどの登場で、 WMIについては、ほとんど記事などで情報を目にすることが少なくなったのですが、枯れてしまった技術なのでしょうか? 豊富なクラスが用意されていて、取得できる情報も多岐に渡り便利なインターフェイスだと思うのですが、 バッチ(bat)と同様に古くて便利な技術です。今でもシステム運用管理などの現場においては非常に良く利用されています。

2.ソースコード

WMIを利用するに当たっての基本となるラス名の一覧などを取得するソースコードは、下記の通りです。 取得したクラス名を利用して、実行用のスクリプトなどを生成するツールを作成します。

(1)WMIの名前空間を取得するサンプル (namespace.hsp)
(2)WMIのWin32拡張クラス名の一覧を取得 (VBScript版) (win32ex.hsp)
(3)クラスに対応したプロパティ一覧取得と実行用スクリプトの生成 (propgen.hsp)
筆者の環境で実行した結果、(2)のサンプルで取得できたクラス名は、全部で394個有りました。
(3)のpropgen.hspについては、当ブログの別記事で扱います。




namespace.hspは、WMIの名前空間を取得するスクリプトです。 実行すると、取得した名前空間を表示したメッセージボックスが表示されます。 筆者の環境で実行して見たところ、18個の名前空間が取得されました。どのように利用するか判りませんが、 システムによっては名前空間の設定が必要なものもあるようです?
namespace.hsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
;***** WMIの名前空間の取得 (namespace.hsp) *****
newcom objVBsc, "ScriptControl"
objVBsc("Language")="VBScript"
 
  vbs  = ""
  vbs +=" function vbcmd()¥n"
  vbs +=" Dim objService¥n"
  vbs +=" Dim objClasses¥n"
  vbs +=" Dim objClass¥n"
  vbs +=" Dim ret¥n"
  vbs +=" Set objService = GetObject(¥"winmgmts:¥¥¥¥¥.¥¥root¥")¥n"
  vbs +=" Set objClasses = objService.InstancesOf(¥"__NAMESPACE¥")¥n"
  vbs +=" for each objClass in objClasses¥n"
  vbs +=" ret = ret & objClass.Name & vbCrLf¥n"
  vbs +=" Next¥n"
  vbs +=" msgbox ret¥n"
  vbs +=" Set objService = Nothing¥n"
  vbs +=" Set objClasses = Nothing¥n"
  vbs +=" Set objClass = Nothing¥n"
  vbs +=" Set ret = Nothing¥n"
  vbs +=" End Function¥n"
 
objVBsc->"AddCode" vbs
objVBsc->"Run" "vbcmd"
delcom objVBsc
stop
win32ex.hspは、WMIのWin32拡張クラス名の一覧を取得 (VBScript版)します。
win32ex.hsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;***** win32拡張クラスの一覧の作成  (win32ex.hsp) *****
#packopt type 0
#packopt name "win32ex"
#packopt runtime "hsprt"
#packopt manifest "app.manifest"
#packopt icon "sample.ico"
#packopt hide 1
 
#module
#deffunc SendVBSSave str VBSName
  notesel SendVBS@
  notesave dir_cur+"¥¥"+VBSName
  return
#global
 
#uselib "kernel32.dll"
#cfunc GetEnvironmentVariable "GetEnvironmentVariableA" var,var,int
#const  WshHide     0
#define MAX_PATH    260
 
screen 0,640,480,0,ginfo_dispx-640>>1,ginfo_dispy-480>>1
 
;***** 環境変数を取得 *****
sdim cp,MAX_PATH+2
ev="Comspec"
ret=GetEnvironmentVariable(ev,cp,MAX_PATH)
if ret==0 : stop
;***** ローカルPCのクラス名を取得するVBScriptを作成 *****
SendVBS=""
SendVBS += "On Error Resume Next¥n"
SendVBS += "¥n"
SendVBS += "Dim strComputer¥n"
SendVBS += "Dim objWMIService¥n"
SendVBS += "Dim colClasses¥n"
SendVBS += "Dim objClass¥n"
SendVBS += "¥n"
SendVBS += "strComputer = ¥""¥n"
SendVBS += "Set objWMIService = GetObject(¥"winmgmts:¥¥¥¥¥" & strComputer & ¥"¥¥root¥¥cimv2¥")¥n"
SendVBS += "Set colClasses = objWMIService.SubclassesOf()¥n"
SendVBS += "¥n"
SendVBS += "For Each objClass In colClasses¥n"
SendVBS += "    WScript.Echo objClass.Path_.Path¥n"
SendVBS += "Next¥n"
SendVBS += "¥n"
SendVBS += "Set strComputer = Nothing¥n"
SendVBS += "Set objWMIService = Nothing¥n"
SendVBS += "Set colClasses = Nothing¥n"
SendVBS += "Set objClass = Nothing¥n"
 
  font "Meiryo UI",16
mes "ただいま、データを取得しています。"
;***** dir_curの場所へセーブする *****
SendVBSSave "win32exlist.vbs"
wait 50
;***** 実行してwin32拡張クラスのリスト一覧を出力する *****
newcom WshShell, "WScript.Shell"
fname = "cscript win32exlist.vbs |findstr /I ¥"Win32_¥" > win32extmp.txt"
WshShell->"Run" cp+" /c " + fname ,WshHide, 1
wait 100
;***** 先頭にパス名が付加された形式で取得されるので整形する *****
sdim SendVBS : sdim work : sdim buf : sdim data
SendVBS = ""
exist "win32extmp.txt"
if strsize==-1 : dialog "win32extmp.txt"+ "の取得に失敗しました。" : end
notesel buf
noteload "win32extmp.txt"
notepos=0 : count=0 
repeat notemax 
    getstr work,buf,notepos : notepos+=strsize 
    cm = getpath(work,8) : ls = strlen(cm) 
    data = strmid(cm,6,ls-6) 
    ;***** 'Win32_Perf...' は必要ないので除外する ***** 
    if strmid(data,0,10) = "Win32_Perf" : continue 
    SendVBS += data + "¥n" 
    count++ 
    if work="" : break 
loop 
;***** 整形したものを save する ***** 
SendVBSSave "win32extmp.txt" 
wait 50 
;***** SORT ***** 
fname = "sort win32extmp.txt /o win32exlist.txt" 
WshShell->"Run" cp+" /c " + fname ,WshHide, 1 
dialog "" + count + "個のクラス名一覧の取得が完了しました。" 
delcom WshShell 
delete "win32extmp.txt" 
end

3.ダウンロード

提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。

※今回の記事におけるソースコードや実行形式ファイルのダウンロード提供はありません。別記事の「HSPでWMIの各種情報を取得(実行用スクリプトの生成)」で 同梱してあります。
掲載リストをコピーして利用して下さい。実行は、HSPスクリプトエディタにソースコードを貼り付けて実行(F5)して下さい。

■関連記事
・HSPでWMIの各種情報を取得(実行用スクリプトの生成)

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

キーボードのキーコードの一覧表