Thu, 21 May 2009 (平成21年) [長年日記]
_ PowerShell でバージョンチェック
PowerShell だとレジストリの中身を手軽に読み出せるのでこんなことができることを知った。
PS C:\> foreach ( $key in $(dir HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | where {$_.getvalue("publisher") -like "*adobe*"}) ) { $key.getvalue("displayname"); $key.getvalue("displayversion") } # ここまで一行で
出力
Adobe Flash Player 10 ActiveX 10.0.22.87 Adobe Flash Player 10 Plugin 10.0.22.87 Adobe Reader 9.1.1 - Japanese 9.1.1
まずはこれがひとかたまり。
$(dir HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | where {$_.getvalue("publisher") -like "*adobe*"})
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall を読み取って Publisher に adobe の文字が含まれているものだけを集めたものを作っているという解釈でいいはず。
これがわかるとあとはこう見ればいい。
foreach ( $key in ~ ) { $key.getvalue("displayname"); $key.getvalue("displayversion") }
抽出されたものを $key に放り込んで displayname と displayversion を表示させてる。
_ PowerShell でバージョンチェック・その二
条件が整っていればリモートマシンのレジストリも読めることがわかったので悪戦苦闘した結果。
$vendorName = 'adobe' foreach ( $machineName in ('srv1', 'client1', 'client2') ) { "$machineName : " $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $machineName) $path = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' $regKey1 = $reg.OpenSubKey($path) foreach ( $subkey in $regKey1.GetSubkeyNames() ) { $regKey2 = $reg.OpenSubKey("$path\$subkey") if ($regKey2.getvalue("publisher") -like "*$vendorName*") { $regKey2.getvalue("displayname") $regKey2.getvalue("displayversion") } } }
出力
srv1 : client1 : Adobe Flash Player 10 ActiveX 10.0.22.87 Adobe Flash Player 10 Plugin 10.0.22.87 Adobe Reader 9.1.1 - Japanese 9.1.1 client2 :
ただし、読めるかどうかの条件がどういうものだかまだ不明……
_ アドビ、四半期毎に定例パッチを配信へ
出る日がわかるようになるのはありがたい。Apple もはっきりさせてくれないかな。