統合インストール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 - 統合イメージ内への配置スクリプト
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
というコマンドラインになるだろう。
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という文字列値があり更新プログラムの名前が保存されている。
もうひとつは、HKLM\SOFTARE\Microsoft\Windows\Updates 以下にあるもので、こちらもサブキーがKB番号になっている場合が多い。更新プログラムの名前は、Description あるいは PackageName という値に保存されている。
数は少ないが、片方にしかインストール情報が保存されていない更新プログラムがあるので、両方チェックするようにしている。まれに、どちらにも情報が保存されない更新プログラムもあり、その場合は、インストールされているかどうかを別の方法でチェックしなければならない。その方法については、下記で個別に説明している。
%SSUPDATE%\WMP11に以下の四つのインストーラがあるかチェックし、なければインストーラ(wmp11-windowsxp-x86-ja-jp.exe)を展開して作成する。
umdf.exe | Microsoft User-Mode Driver Framework Feature Pack 1.0 |
WindowsXP-MSCompPackV1-x86.exe | Microsoft Compression Client Pack 1.0 for Windows XP |
wmfdist11.exe | Windows Media Format 11 runtime |
wmp11.exe | Windows 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に統合してあるものも含まれているが、再度インストールしている。
あらかじめ 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にはインストールできない。なので、このスクリプトではサポートしていない(将来的にはサポートするかも)。
dotnetfx.exe を%TEMP%\NDP1.1に展開して netfx.msi を作り、これを使ってインストールする。日本語 Language Packについても同様に、langpack.exe を展開し、langpack.msiを使ってインストールする。
.NET Framework 3.5をインストールすると、同時に2.0と3.0もインストールされる。
2.0のセキュリティ更新プログラム KB2604092 と KB2742596 の関係がややこしい。
Windows Updateでは、KB2604092→KB2742596の順にインストールされる。ところが、KB2742596のインストール時に、HKLM\SOFTARE\Microsoft\Windows\UpdatesにあるKB2604092のインストール情報は削除されてしまうのだ。KB2742596がKB2604092を置き換える後継プログラムであるならば、古い更新プログラムのインストール情報が削除されるのは理解できるのだが、それだとWindows Updateで両方ともインストールされる理由がわからない。
やむなく、このサイレント・インストーラでは、HKLM\SOFTARE\Microsoft\Windows\Updatesをみて、KB2604092→KB2742596の順にインストールされるようにしている。
ダウンロードセンターからはKB982524がダウンロードできるが、UpdateカタログからはKB982524としてKB976576とKB977354の二つがダウンロードされる。KB982524をインストールすると、KB976576とKB977354のインストール情報が作成される。
そこで、KB976576とKB977354の両方ともインストールされていない状態で、KB976576のインストーラがあればそれをインストールし、そうでなければ、KB976576とKB977354をインストールしている。
PowerShell 2.0には、.NET Framework 2.0 SP1が必要なので、.NET Framework 3.5のインストールをする場合にのみインストールできるようにしている。
Current Version\Uninstall | Updates |
---|---|
Windows Search 4.0 | KB940157 |
フォントファイル %windir%\Fonts\meiryo.ttc が存在すればインストール済みと判断。
%windir%\system32\wuaueng.dll のバージョンが7.6.7600.243以降ならインストール済みと判断。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IMEJP\8.1\version\imjpzp.dic にあるバージョン番号が8.0.5416.0以降ならインストール済みと判断。
KB2836941は、HLKM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\DC3BF90CC0D3D2F398A9A6D1762F70F3\Patches\CCA3C58B75487533687B8B1ECAC3586C にあるインストール情報をチェックしている。
KB2836940は、HLKM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\26DDC2EC4210AC63483DF9D4FCC5B59D\Patches\14E8170F37C90073891DF293B7757A56 にあるインストール情報をチェックしている。
KB2917500は、HLKM\Software\Microsoft\Active Setup\Installed Components\{C3C986D6-06B1-43BF-90DD-BE30756C00DE}\Version にあるバージョン番号が8.0.2195.0以降ならインストール済みと判断。
KB931125は、HLKM\Software\Microsoft\Active Setup\Installed Components\{EF289A85-8E57-408d-BE47-73B55609861A}\Version にあるバージョン番号が40.0.2195.0以降ならインストール済みと判断。
KB890830は、HLKM\Software\Microsoft\RemovalTools\MRT\Version にあるバージョン番号が20DEE2FA-9862-4C40-A1D4-1E13F1B9E8A7ならばインストール済みと判断。
Update.vbsの実行には、ThinkPad X21で約5時間、3.2GHzのCore i5の仮想環境でも約3時間かかった。
実行後、WindowsUpdateを実行すると、更新プログラムがすべてインストールされているのがわかる。
(RTM版の場合、update.vbsから外してあるKB905474(WGA通知アプリケーション)が通知される)。
Qfecheck.exeで検証すると、エラーは報告されなかった(Qfecheck.exeはupdate.vbsでインストールされる)。