======更新プログラムをまとめてインストール======
[[slipstream-updates]] では、更新プログラムを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-update-list-ie]] - IE8とUpdateエージェント(IE7/IE6除く)
* [[xp-update-list-wmp]] - Windows Media Player 11
* [[xp-update-list-net]] - .NET Framework 1.0/1.1/3.5/4
* [[xp-update-list-2]] - その他
====ダウンロード====
更新プログラムのダウンロード方法は、[[download-xp-update]]にある。一括ダウンロードスクリプト(BATファイル)を使うと、環境変数**SSUPDATE**で指定したフォルダにダウンロードされる(指定しなければ、カレントフォルダ\UPDATE)。\\
====統合イメージ内への配置====
更新プログラムは [[slipstream-updates|統合インストール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は、[[slipstream-updates]] でISOイメージを作る前に実行すると良い。[[slipstream-updates#統合まとめ]] で、\\
**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.\\
[[https://msdn.microsoft.com/en-us/library/ms681386.aspx|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.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**)では、この四つは別途インストールが必要だ。(参照:[[xp-update-list-wmp#wmp11インストーラに含まれている更新]])\\
**KB941569・KB973540・KB954155・KB952069・KB978695・KB975558・KB2378111**については、WMP11をインストールした際に、必ずインストールしている。すでに[[slipstream-updates]]で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のセキュリティ更新プログラム **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/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\Uninstall^Updates^
|Windows Search 4.0|KB940157|
===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/.NET Framework 2.0 SP2 の更新プログラムがある: 2013年 9 月==
KB2836941は、HLKM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\DC3BF90CC0D3D2F398A9A6D1762F70F3\Patches\CCA3C58B75487533687B8B1ECAC3586C にあるインストール情報をチェックしている。\\
==KB2836940/An update is available for the .NET Framework 3.5 SP1: June 2013==
KB2836940は、HLKM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\26DDC2EC4210AC63483DF9D4FCC5B59D\Patches\14E8170F37C90073891DF293B7757A56 にあるインストール情報をチェックしている。\\
==KB2917500/不適切に発行されたデジタル証明書によりなりすましが行われることがある==
KB2917500は、HLKM\Software\Microsoft\Active Setup\Installed Components\{C3C986D6-06B1-43BF-90DD-BE30756C00DE}\Version にあるバージョン番号が8.0.2195.0以降ならインストール済みと判断。
==KB931125/ルート証明書の更新プログラム==
KB931125は、HLKM\Software\Microsoft\Active Setup\Installed Components\{EF289A85-8E57-408d-BE47-73B55609861A}\Version にあるバージョン番号が40.0.2195.0以降ならインストール済みと判断。
==KB890830/悪意のあるソフトウェアの削除ツール - 2015 年 6 月==
KB890830は、HLKM\Software\Microsoft\RemovalTools\MRT\Version にあるバージョン番号が20DEE2FA-9862-4C40-A1D4-1E13F1B9E8A7ならばインストール済みと判断。
=====実行後=====
Update.vbsの実行には、ThinkPad X21で約5時間、3.2GHzのCore i5の仮想環境でも約3時間かかった。
{{ :afterupdate.jpg?nolink |}}
実行後、WindowsUpdateを実行すると、更新プログラムがすべてインストールされているのがわかる。\\
(RTM版の場合、update.vbsから外してあるKB905474(WGA通知アプリケーション)が通知される)。
[[https://support.microsoft.com/ja-jp/help/282784/qfecheck-exe-verifies-the-installation-of-windows-2000-and-windows-xp|Qfecheck.exe]]で検証すると、エラーは報告されなかった(Qfecheck.exeはupdate.vbsでインストールされる)。\\
----
~~DISCUSSION|コメント欄~~