コンピューターシステム株式会社

技術BLOG

WMIでPC情報を収集してみた

2020/10/15 松山担当

こんにちは。松山に住んでいるBeppyです。

今回は、簡単なWMIを使ったPC情報を取得するお話です。

最近は、資産管理などの便利なソフトがあるのであまり使用されてはいないと思いますが、

Windows 標準で使用できるWMIでのPC情報を取得することもできます。

そのあたりを今回ちょっとだけ掘り下げてみたいと思います。

実際WMIってなーに?ってなると思うのですが

「WMI(Windows Management Instrumentation)は、Windows OSを管理することを目的にMicrosoftが開発した技術です。」なんだーってぇ。

まぁ、簡単にいうとCPUとかインストールされているソフトとかそんなのがコマンド打てば

表示されるよってものですね。

 

 

 

で、例としてコンピュータ名をとるコマンドを、添付ファイルに貼ってみました。


もし興味あるかたは、ダウンロードして実行してみてください。

情報がメッセージボックスで出てくると思います。

 

'WMIにて使用する各種オブジェクトを定義・生成する。
Dim oClassSet
 Dim oClass
 Dim oLocator
 Dim oService
 Dim sMesStr
'ローカルコンピュータに接続する。
Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
 Set oService = oLocator.ConnectServer
'クエリー条件を WQL にて指定する。
Set oClassSet = oService.ExecQuery("Select * From Win32_OperatingSystem")
'コレクションを解析する。
For Each oClass In oClassSet

 

sMesStr = sMesStr & "コンピュータ名: " & oClass.CSName & vbCrLf & _
"コンピュータの説明: " & oClass.Description & vbCrLf & vbCrLf
 Next
MsgBox "コンピュータ名と説明に関する情報です。" & vbCrLf & vbCrLf & sMesStr
'使用した各種オブジェクトを後片付けする。
Set oClassSet = Nothing<
Set oClass = Nothing
 Set oService = Nothing
 Set oLocator = Nothing

 

いろいろな情報をとるには、以下のWMIクラスで自分のとりたい情報があるか確認してみてください。

コンピュータ名だけではなく、入っているソフトウェアや接続しているネットワークドライブなども取得できます。

 

実際取得した情報を出力するだけだとあまり意味がないので、

どこかのネットワークドライブに格納していくか、以下のようなFunctionでもつくって

メールで飛ばせば管理しやすいかもしれません。

 

基本的には添付ファイルから抜粋した下のようにオブジェクトを呼び出して

Set oClassSet = oService.ExecQuery("Select * From Win32_OperatingSystem")

その中で必要なプロパティを呼び出す感じです。

 

--------------------------------------------------------
For Each oClass In oClassSet
sMesStr = sMesStr & "コンピュータ名: " & oClass.CSName & vbCrLf & _
"コンピュータの説明: " & oClass.Description & vbCrLf & vbCrLf
Next
--------------------------------------------------------

 

いろいろな情報をとるには、以下のWMIクラスで自分のとりたい情報があるか確認してみてください。

コンピュータ名だけではなく、入っているソフトウェアや接続しているネットワークドライブなども取得できます。

 

実際取得した情報を出力するだけだとあまり意味がないので、

どこかのネットワークドライブに格納していくか、以下のようなFunctionでもつくって

メールで飛ばせば管理しやすいかもしれません。

-------------------------------------------------------------------------
Call SEND_CDOMail(メール件名文字列、メール本文文字列)
Function SEND_CDOMail(strSubject ,strTextBody)
 Const strMailTo = "XXXXXXXXXXXX" ' 送信先メールアドレス
 Const strMailFrom = "XXXXXXXXXXXXXX" ' 送信元メールアドレス
 Const strSMTPServer = "XXXXXXX" ' SMTPサーバ
 Const intSMTPPort = 25 ' SMTPポート
' --------------<
' メールを送信
' --------------
dim oMsg
Set oMsg  = CreateObject("CDO.Message")
With oMsg
 .From   = strMailFrom
 .To   = strMailTo
 .Subject  = strSubject
 .TextBody  = strTextBody
With .Configuration.Fields
 .Item ("http://schemas.microsoft.com/cdo/configuration/sendusing")  = 2
 .Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver")  = strSMTPServer
 .Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = intSMTPPort
 .Update
End With
 .Send
End With
oMsg
If Err.Number <> 0 Then
 WScript.Echo "SEND ERROR " &  Err.Description
 END IF
End Function
-------------------------------------------------------------------------

上記のようにメールを送信するVBSをつかって

WMIの吐き出した情報を引数にいれて送付すれば情報がとれるので

PC起動時に動作するように設定してあげる or タスクで 12時とかに動作するようにして

情報があがってくるため、PC情報を管理しやすくなると思います。

 

興味があるかたは、何台かのPCに入れてみて情報が吸いあがってくるかやってみてください。

 

メールアドレスでPOPしてとってくるメールソフトがoutlookであれば、

それをAccessで管理することも可能かと思います。

 

※個人的にはやってみて思ったのは、SMTPは双方向じゃないので

 情報を完璧にしたい人は、FTPとか双方向でコネクションをちゃんとはってから

 動作するプロトコルで最終的な収集はしたほうがよいかと思います。