2015年7月2日木曜日

systeminfoで、リモートで物理メモリの合計をゲット

工場内にある2000台近くのPCの実搭載メモリの調査が必要になり、systeminfoコマンドを使って調査を開始しました。

コマンドプロンプトで、下記のコマンドを発行すれば取得できます。
C:\>systeminfo /s HostName | find “物理メモリの合計”

しかし、このコマンドを2000回も繰り返すのは嫌なので、取りあえずHostNameのリストを読み込んで上記のコマンドをループするバッチを作って実行しましたが、そのままではレポートに出来ないので、VBscriptで作ることにしました。

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("systeminfo /s " & strHostName )
Do While oExec.Status = 0
WScript.Sleep 100
Loop
WScript.echo oExec.StdOut.ReadAll

こんな感じで・・・

ところが、WshShell.Execは実行の終了を待たないので、oExec.Statusが終了を示す1になるまで待たせているのですが、なんといつまでたっても変化しません。

PowerShellのワンライナーを起動してみましたが、コマンドの戻り値が直接読めないので却下

WshShell.Exec(powershell -NoProfile -ExecutionPolicy Unrestricted -command ""& { Get-WmiObject -Class Win32_PhysicalMemory -computername "
strLine = strLine & objParm(0) & """}")

それでは、ということでVBscriptからWmiを呼び出してやることで対応しました。

Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer(objParm(0))

Set oClassSet = oService.ExecQuery("Select * From Win32_ComputerSystem")
For Each oClass In oClassSet
lRet = oClass.TotalPhysicalMemory
strHost = oClass.DNSHostName
Next

まあ、こんなことせずに System Center Configuration Managerで各クライアントのハード情報のレポートを出せば良いのですが、リアルタイムでは無いと思うので、仕方ないですね

それと、systeminfoはたくさんの情報を取ってくるので時間がかかりますが、wmiでハード情報だけを取ってくると4倍高速に取得出来る様になります。