ちょいと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が返らないといかん。
謎。
だが、大勢に影響なさそうなのでこれで通す感じ。