2013/10/30

To get WMI properties

ちょいとWindowsクライアントからメモリの情報を取得したくて、
ひっさびさにVBScriptなんぞを書いてインベントリの真似事的なものを作成している。

知りたいのは、だいたい以下の感じ。
 ・メモリスロットの総本数
 ・メモリ搭載容量
 ・ メモリ種類

スクリプト的にはこんなところか。

Set objWMI = GetObject("winmgmts:\\.\root\CIMV2") 
aryForm = Array("Unknown","Other","SIP","DIP","ZIP","SOJ","Proprietary","SIMM", _
    "DIMM","TSOP","PGA","RIMM","SODIMM","SRIMM","SMD","SSMP", _
    "QFP","TQFP","SOIC","LCC","PLCC","BGA","FPBGA","LGA")
aryType = Array("Unknown","Other","DRAM","Sync-DRAM","Cache-DRAM","EDO","EDRAM","VRAM", _
    "SRAM","RAM","ROM","Flash","EEPROM","FEPROM","EPROM","CDRAM", _
    "3DRAM","SDRAM","SGRAM","RDRAM","DDR","DDR2")

' -----------------------------------------

Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_ComputerSystem") 
For Each objItem in colItems
    strResult = strResult & "SystemName: " & objItem.Name & vbCr
    strResult = strResult & "SystemManufacturer: " & objItem.Manufacturer & vbCr
    strResult = strResult & "SystemModel: " & objItem.Model & vbCr
    strResult = strResult & "TotalMemory: " & objItem.TotalPhysicalMemory & " bytes" & vbCr
Next

Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_PhysicalMemoryArray") 
For Each objItem in colItems
    strResult = strResult & "MemorySlot: " & objItem.MemoryDevices & vbCr
Next

Set colItems = objWMI.ExecQuery("SELECT * FROM Win32_PhysicalMemory") 
For Each objItem in colItems 
    strResult = strResult & "----- " & aryForm(objItem.FormFactor) & " Module (" & _
        aryType(objItem.MemoryType) & ") on " & objItem.DeviceLocator & vbCr

    strResult = strResult & "Tag: " & objItem.Tag & vbCr
    strResult = strResult & "DataWidth: " & objItem.DataWidth & " bit" & vbCr
    strResult = strResult & "MemoryCapacity: " & objItem.Capacity & " bytes" & vbCr
    strResult = strResult & "Speed: " & objItem.Speed & "MHz" & vbCr
Next

WScript.Echo strResult

Option Explicitしていないので汚いもんだけど。


結果は下記のとおり。

で、Moduleの後ろのカッコ内がMemoryTypeから拾ったデータなんだが、
なぜか0(=Unknown)になってしまう。

MSDNのライブラリを確認すると、DDR3がない。
「じゃあDDR3なんじゃね?」としたいところだが、
このPC、DDR2なんだよね。本来21が返らないといかん。

謎。
だが、大勢に影響なさそうなのでこれで通す感じ。