Only Neat Thing

たったひとつの冴えたやり方

ユーザ用ツール

サイト用ツール


サイドバー

スタートページ

IBM ThinkPad X20/21

Windows XP

Lenovo ThinkPad X200

Intel DG965WH

Panasonic Let'snote CF-R

SSD

Hyper-V使いこなし

Misc

updates-silent-installer

更新プログラムをまとめてインストール

 統合インストールISO作成 では、更新プログラムをXPのインストールCDに統合した。ただし、統合できたのは /integrate オプションが有効な更新プログラムだけだ。それ以外の更新プログラムは、XPのインストール後に一つひとつインストールしなければならない。
 IE8、Windows Media Player 11、.NET Frameworkなどをインストールし、さらにそれぞれの更新プログラムをインストールするのはたいへん面倒な作業だ。そこで、まとめてインストールしてくれるサイレント・インストーラを作ることにした

 以下のスクリプト(BATファイル)で使う環境変数のリストを示す。

環境変数用途未指定時のデフォルト
SSTARGET統合イメージのフォルダカレントフォルダ\TARGET
SSUPDATE更新プログラムのフォルダカレントフォルダ\UPDATE

 こういう行が各スクリプトの先頭に置かれる。

if not defined SSTARGET set SSTARGET=%CD%\TARGET
if not defined SSUPDATE set SSUPDATE=%CD%\UPDATE

更新プログラムの準備

 このスクリプトでインストールできるのは、以下の更新プログラムだ。

ダウンロード

 更新プログラムのダウンロード方法は、XPの更新プログラムのダウンロードにある。一括ダウンロードスクリプト(BATファイル)を使うと、環境変数SSUPDATEで指定したフォルダにダウンロードされる(指定しなければ、カレントフォルダ\UPDATE)。

統合イメージ内への配置

 更新プログラムは 統合インストールDVD の中に配置することを想定している。統合イメージのフォルダは環境変数SSTARGETで指定する。

 更新プログラムを統合イメージの中にコピーするスクリプトは、こんな感じ

if not defined SSUPDATE set SSUPDATE=%CD%\UPDATE
if not defined SSTARGET set SSTARGET=%CD%\TARGET
mkdir %SSTARGET%\UPDATE
copy /y %SSUPDATE%\Q282784_WXP_SP1_x86_ENU.exe %SSTARGET%\UPDATE
copy /y %SSUPDATE%\WindowsXP-KB923789-x86-JPN.exe %SSTARGET%\UPDATE
copy /y %SSUPDATE%\WindowsXP-WindowsMedia-KB2378111-x86-JPN.exe %SSTARGET%\UPDATE
・・・

 具体的には、環境変数SSTARGETで指定したフォルダの下にUPDATEフォルダを作り、そこに環境変数SSUPDATE指定したフォルダにある更新プログラムをコピーしている。

 実際のスクリプト(BATファイル)がこちら。

copyaddon.bat - 統合イメージ内への配置スクリプト

 このスクリプトでは、サブフォルダを作って、WMP11/.NET1.0のインストーラをサブフォルダの中に展開している。どうせインストール時に展開するのだから、あらかじめDVD-Rの中に展開したファイルを配置した方が効率が良いからだ。展開の際に管理者権限を要求するので、XP以外のWindowsで実行する際は、ユーザーアカウント制御の画面に煩わされないよう、コマンドプロンプトを管理者として実行した方が良いだろう。

 copyaddon.batは、統合インストールISO作成 でISOイメージを作る前に実行すると良い。統合まとめ で、
  SSINIT.bat → SSSP3.BAT → make.bat
 としているのを、
  SSINIT.bat → SSSP3.BAT → make.bat → copyaddon.bat
 の順で実行する。copyaddon.bat によって、約1GBのファイルがコピーされるはずだ(これによって、統合インストールISOのサイズは約2GBへと倍増する)。

サイレント・インストーラの配置

 サイレント・インストーラはこちら。

update.vbs - 更新プログラム・サイレント・インストーラ

 これを、統合イメージのフォルダ(%SSTARGET%の指定するフォルダ)に配置する。copyaddon.batが%SSUPDATE%\update.vbsを%TARGET%にコピーしてくれる。

 あとは従前通りに、ISOイメージを作成し、DVD-Rに書き込み、XPをインストールする。

サイレント・インストーラの起動

 XPのインストールが終わったら、サイレント・インストーラを起動する。update.vbsはVBScriptだが、WScriptで実行するようにはできていないので、ダブルクリックで起動することはできない。コマンドプロンプトからcscript.exeを使って起動する。
 DVDドライブはたいていDドライブになっていると思われるので、

cscript D:\update.vbs

 というコマンドラインになるだろう。

update.bat
cscript .\update.vbs

 いちおう、BATファイルも作ってみた。

 インストール後に再起動を要求する更新プログラムが多いので、何度も再起動しながら続きを実行していく。すべての更新プログラムがインストールされるまで数時間を要する。更新プログラムのインストール終了と表示されれば終了だ。

 更新プログラムは、update.vbsのあるフォルダの下のUPDATEフォルダ(通例D:\UPDATE)に配置されている前提だ。他のフォルダに配置している場合には、環境変数SSUPDATEで指定する。

インストールする更新プログラムの選択

'インストール オプション(それぞれTrue/Falseを設定してください)
Const I_SEARCH4 = True		'Windows Search 4.0
Const I_SILVERLIGHT = True	'Microsoft Silverlight
Const I_MBSA = True		'Microsoft Baseline Security Analyzer
Const I_WMP11 = True		'Windows Media Player 11
Const I_NET10 = True		'.NET Framework 1.0
Const I_NET11 = True		'.NET Framework 1.1
Const I_NET35 = True		'.NET Framework 3.5
Const I_NET4CP = True		'.NET Framework 4 Client Profile
Const I_NET4F = True		'.NET Framework 4 Full
Const I_PSHELL = True		'Windows PowerShell 2.0 (要I_NET35)
' I_NET4CPとI_NETFを両方Trueにした場合は、Full版のみインストールされます

 update.vbsの30行目あたりに、インストールする更新プログラムを選択するオプションがある。メモ帳などで、これを編集すれば、Falseに設定した更新プログラムはインストールを省略するようになっている。
 (IE8その他のインストールを抑制するオプションはないので、必要ならばスクリプトを直接編集して欲しい)。

ログファイル

 update.vbsはログファイルを作る。ファイル名はupdate.logで、update.vbsの置かれているフォルダに作ろうとするが、DVD-Rに配置している場合は書き込みできないので、環境変数TEMPで指定されるフォルダに作る。

技術情報

 update.vbsを書くのに調べた情報などをメモしておく。

再起動

 更新プログラムが正常にインストールされたかどうかは、終了コードを見ればわかる。0ならば正常終了、0以外ならば異常終了だ。ただし、下位16ビットが十進で3010(16進で0x0bc2)の場合は「インストールは正常に終了したが再起動が必要」という意味だ。再起動せずに次の更新プログラムをインストールしようとしてもエラーになってしまうので、再起動せざるを得ない。

ERROR_SUCCESS_REBOOT_REQUIRED
3010 (0xBC2)
The requested operation is successful. Changes will not be effective until the system is rebooted.
System Error Codes (1700-3999) (microsoft)

 再起動後もスクリプトが実行し続けられるように、HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce に自分自身をセットしてから、shutdownコマンドを使って再起動している。
 環境変数SSUPDATEが再起動によって失われないように、User環境変数にSSUPDATEをセットしている(更新プログラムをインストールし終えたら、User環境変数のSSUPDATEを削除している)。

更新プログラムがインストールされているか

 再起動してスクリプトを先頭から実行した場合、すでにインストール済みの更新プログラムを再度インストールする無駄を避けるために、「その更新プログラムがインストールされているか」をチェックしている。

 更新プログラムのインストール情報は、レジストリの2か所に保存されている。

 ひとつは、レジストリの HKLM\SOFTWARE\Microsoft\Windows\Current Version\Uninstall 以下にあるもので、サブキーがKB番号になっている場合が多い。それぞれのサブキーの下にDisplayNameという文字列値があり更新プログラムの名前が保存されている。

 サブキー名がUUID(128ビットの16進数)になっていて、(既定)の値にKB番号が入っているものもある。これはおそらく、すでに新しい更新プログラムがインストールされているのに、古い更新プログラムをインストールしないようにするための仕組みだろう。

 もうひとつは、HKLM\SOFTARE\Microsoft\Windows\Updates 以下にあるもので、こちらもサブキーがKB番号になっている場合が多い。更新プログラムの名前は、Description あるいは PackageName という値に保存されている。

 数は少ないが、片方にしかインストール情報が保存されていない更新プログラムがあるので、両方チェックするようにしている。まれに、どちらにも情報が保存されない更新プログラムもあり、その場合は、インストールされているかどうかを別の方法でチェックしなければならない。その方法については、下記で個別に説明している。

更新プログラムごとの情報

Windows Media Player 11

 %SSUPDATE%\WMP11に以下の四つのインストーラがあるかチェックし、なければインストーラ(wmp11-windowsxp-x86-ja-jp.exe)を展開して作成する。

umdf.exeMicrosoft User-Mode Driver Framework Feature Pack 1.0
WindowsXP-MSCompPackV1-x86.exeMicrosoft Compression Client Pack 1.0 for Windows XP
wmfdist11.exeWindows Media Format 11 runtime
wmp11.exeWindows Media Player 11

 インストーラをダウンロードセンターからダウンロードした場合、KB941776・KB939683・KB929399・KB954154はインストーラに含まれているため、別途インストールする必要はない(wmp11-windowsxp-x86-ja-jp.exeのバージョンが11.0.5721.5262)。一方、Updateカタログからダウンロードしたバージョン(11.0.5721.5145)では、この四つは別途インストールが必要だ。(参照:wmp11インストーラに含まれている更新

 KB941569・KB973540・KB954155・KB952069・KB978695・KB975558・KB2378111については、WMP11をインストールした際に、必ずインストールしている。すでに統合インストールISO作成でXPのインストールISOに統合してあるものも含まれているが、再度インストールしている。

.NET Framework 1.0

 あらかじめ dotnetredist.exe を展開してNDP1.0フォルダに dotnetfx.exe を作っておく。さらに dotnetfx.exe を%TEMP%\NDP1.0に展開して netfx.msi を作り、これを使ってインストールする。%TEMP%に展開するのは、インストーラが書き込み可能なフォルダに配置されていないとエラーになるから、である。

 .NET Framework 1.0には他にも、KB979904 (MS10-041)・KB2604042 (MS12-035)・KB2698035 (MS12-074)・KB2742607 (MS13-004)・KB2833951 (MS13-052)・KB2904878 (MS14-009) という更新プログラムがあるが、いずれもMedia Center Edition か Tablet PC Edition のみサポートしており、普通のXPにはインストールできない。なので、このスクリプトではサポートしていない(将来的にはサポートするかも)。

 もともと.NET Framework 1.0は、Media CenterかTablet以外ではほとんど使われておらず、普通のXPには1.0そのものがインストール不要かもしれない(Windows Updateでもインストール候補に挙がらないし)。

.NET Framework 1.1

 dotnetfx.exe を%TEMP%\NDP1.1に展開して netfx.msi を作り、これを使ってインストールする。日本語 Language Packについても同様に、langpack.exe を展開し、langpack.msiを使ってインストールする。

.NET Framework 3.5

 .NET Framework 3.5をインストールすると、同時に2.0と3.0もインストールされる。

KB2604092/KB2742596

 2.0のセキュリティ更新プログラム KB2604092KB2742596 の関係がややこしい。
 Windows Updateでは、KB2604092→KB2742596の順にインストールされる。ところが、KB2742596のインストール時に、HKLM\SOFTARE\Microsoft\Windows\UpdatesにあるKB2604092のインストール情報は削除されてしまうのだ。KB2742596がKB2604092を置き換える後継プログラムであるならば、古い更新プログラムのインストール情報が削除されるのは理解できるのだが、それだとWindows Updateで両方ともインストールされる理由がわからない。

 やむなく、このサイレント・インストーラでは、HKLM\SOFTARE\Microsoft\Windows\Updatesをみて、KB2604092→KB2742596の順にインストールされるようにしている。

KB982524/KB976576/KB977354

 ダウンロードセンターからはKB982524がダウンロードできるが、UpdateカタログからはKB982524としてKB976576とKB977354の二つがダウンロードされる。KB982524をインストールすると、KB976576とKB977354のインストール情報が作成される。
 そこで、KB976576とKB977354の両方ともインストールされていない状態で、KB976576のインストーラがあればそれをインストールし、そうでなければ、KB976576とKB977354をインストールしている。

KB968930/Windows PowerShell 2.0

 PowerShell 2.0には、.NET Framework 2.0 SP1が必要なので、.NET Framework 3.5のインストールをする場合にのみインストールできるようにしている。

Uninstallにしかインストール情報がないもの

  • KB923789: Adobe の Macromedia Flash Player の脆弱性により、リモートでコードが実行される
  • Internet Explorer 8
  • Microsoft Silverlight
  • Microsoft Baseline Security Analyzer 2.3
  • Microsoft .NET Framework (JPN)/.NET Framework 1.0

Updatesにしかインストール情報がないもの

  • Microsoft .NET Framework 1.0 Service Pack 3 (KB867461)

UninstallとUpdatesで違う名前になっているもの

Current Version\UninstallUpdates
Windows Search 4.0KB940157

UninstallとUpdatesのどちらにもないもの

VistaFont/Windows XP 向け ClearType 対応メイリオ バージョン 5.00

 フォントファイル %windir%\Fonts\meiryo.ttc が存在すればインストール済みと判断。

KB2607070/Windows Update エージェント バージョン 3.0

 %windir%\system32\wuaueng.dll のバージョンが7.6.7600.243以降ならインストール済みと判断。

ZP81UPDW/Microsoft IME 2002 郵便番号辞書更新 2008 年 11 月版 (Windows XP 用)

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IMEJP\8.1\version\imjpzp.dic にあるバージョン番号が8.0.5416.0以降ならインストール済みと判断。

KB2836941

 KB2836941は、HLKM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\DC3BF90CC0D3D2F398A9A6D1762F70F3\Patches\CCA3C58B75487533687B8B1ECAC3586C にあるインストール情報をチェックしている。

KB2836940

 KB2836940は、SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\26DDC2EC4210AC63483DF9D4FCC5B59D\Patches\14E8170F37C90073891DF293B7757A56 にあるインストール情報をチェックしている。

実行後

 Update.vbsの実行には、ThinkPad X21で約5時間、3.2GHzのCore i5の仮想環境でも約3時間かかった。

 実行後、WindowsUpdateを実行すると、更新プログラムがすべてインストールされているのがわかる。
 (RTM版の場合、update.vbsから外してあるKB905474(WGA通知アプリケーション)が通知される)

 Qfecheck.exeで検証すると、エラーは報告されなかった(Qfecheck.exeはupdate.vbsでインストールされる)。


~~DISCUSSION|コメント欄~~

updates-silent-installer.txt · 最終更新: 2019/06/19 01:07 by admin

ページ用ツール