2012年5月10日木曜日

MSI 自己修復 ( self-repair ) を抑止する方法

MSI 自己修復 ( self-repair ) を抑止する方法


仮想アプリケーションを利用している時に
MSIの自己修復(self-repair)画面が表示されることがあります。


理由は様々ですが、MS-Officeを仮想アプリとして利用している場合に
発生することが多いです。
特に、別バージョンのMS-Officeをネイティブにインストールしている場合は
かなりの確率でこの自己修復を見ることになります。


MS-Office特有の問題ではなく、MSI形式でインストールされるアプリで
自己修復機能を持った物であれば、発生する可能性があります。

※ThinAppに限らず、一般的なインストール環境でも、App-Vでも発生する問題です。



大切な前提条件
クリーンなWindows OS (何もアプリがインストールされていない)環境では
問題なく利用できる。
自己修復が表示されないという事が大切です。


初めに、この修復処理自体は悪いことではありません。
人間の免疫に似ていると思います。
ウイルス等を駆除して、健康な状態を保とうとする防衛措置ですね。
しかしながら、時にはその防衛力の高さから、過敏な反応により
問題のない物をウイルスと判断して、攻撃することが問題になる場合があります。
いわゆるアレルギー反応です。
そんな私もスギ花粉に悩まされています。

本来は、スギ花粉自体は問題ないのに、過剰な防衛反応により
だるさや鼻水などの症状が現れます。
スギ花粉の対策はたくさんありますが、鼻の粘膜を焼く事で、対処するレーザー治療がありますね。
花粉が飛散する時期の前に処置して、ピークをすぎる頃には
粘膜はもとに戻り、ノーマル状態となるのかな。。。
やってみたいんですが、やったことは無いです。。。

と全然関係ない話ですが、今回のMSI 自己修復の対処は
鼻の粘膜を焼くレーザー治療と似ている気がします。(無理矢理ですが)

流れとしては、以下のステップで対処していきます。
1.アレルゲンを特定します。
 何にアレルギー反応を起こしているのか、(MS-Office、Adobe製品、その他なのか)
2.効果があるかを試します。
 レジストリを変更して、抑止効果があるかを試します。
3.レーザー治療を行います。
 仮想アプリケーションパッケージの仮想レジストリの初期値を変更して
 再buildします。

具体的な対処方法は以下です。

実行環境:
Windows 7 SP1 x64
Office2010インストール環境
仮想アプリ:
Office2000 SP3
(Word,Excel,Powerpoint,Access)
症状:
Word2000を起動すると、MSIの自己修復が起動してしまう。

※仮想レジストリを編集する必要があるので、
エントリーポイントとしてRegedit.exeを作成しておいてください。
本物のRegeditと区別するために、ここでは、vRegedit.exeと呼びます。

1.アレルゲンの特定方法
MSIの自己修復が起動されると、イベントビューワーのアプリケーションに
ログが登録されます。

-------------------------------------------
説明:
製品 '{00000411-78E1-11D2-B60F-006097C998E7}'
機能 'ProductNonBootFiles'
コンポーネント '{BF4D7A70-D89D-11D1-A17D-00A0C90AB50F}' の検出に失敗しました。
リソース 'C:\Windows\system32\MSVBVM60.DLL' がありません。
-------------------------------------------

これが重要な情報です。
3つ重要な情報が書かれています。
(製品、機能、コンポーネント)
今回は製品、機能を利用します。

1つめは、何のアプリなのかの情報が記録されています。
製品:
{00000411-78E1-11D2-B60F-006097C998E7}

vRegedit.exeを起動します。
レジストリで以下のキーを開きます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products
検索します。(00000411-78E1-11D2-B60F-006097C998E7)
みつかりません。。。

実は、00000411-78E1-11D2-B60F-006097C998E7を翻訳しないといけません。

翻訳前
 00000411-78E1-11D2-B60F-006097C998E7
翻訳後
 114000001E872D116BF00006799C897E

この翻訳には決められたルールがあります。
00000411-78E1-11D2-B60F-006097C998E7






2つに分割します。
00000411-78E1-11D2
B60F-006097C998E7

前半部分(00000411-78E1-11D2)をハイフンで区切られた単位で逆から並び替えます。
00000411 -> 11400000
78E1 -> 1E87
11D2 -> 2D11

連結します。
11400000-1E87-2D11

後半部分(B60F-006097C998E7)を2文字単位で左右を入れ替えます。
分かりにくいので、2文字単位にハイフンを入れてから左右を入れ替えます。
B60F -> B6-0F
006097C998E7 -> 00-60-97-C9-98-E7

その後、
B6-0F -> 6B-F0
00-60-97-C9-98-E7 -> 00-06-79-9C-89-7E

連結します。
6B-F0-00-06-79-9C-89-7E

前半部分と後半部分の結果を連結します。
11400000-1E87-2D11-6B-F0-00-06-79-9C-89-7E

最後にハイフンを削除します。
114000001E872D116BF00006799C897E

vRegedit.exeから以下のキーを開きます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products
検索します。(114000001E872D116BF00006799C897E)
見つかります。

その下の階層にある、InstallPropertiesを開きます。
右ペインのDisplayNameを見ると、何のアプリ種別かわかります。
この場合は、Microsoft Office 2000 SR-1 Premiumです。


2.効果があるかを試します。

次に、アレルギー反応を起こしている、具体的な機能を無効化してしまいます。
機能 'ProductNonBootFiles'

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\114000001E872D116BF00006799C897E
Featuresを開きます。
※編集前に念のため、レジストリをバックアップしておいてください。
たくさんありますが、ProductNonBootFilesを探します。

ダブルクリックして、値のデータを空っぽにします。
※値のデータの内容を空白状態にします。値の名前自体をを削除しては、いけません。


次に、効果があるか、もう一度アプリを実行してみます。
まだ続く場合は、イベントビューワーを確認してみます。
機能の部分が変わっている事が多いので1つの対処だけではなく、
繰り返して対処していきます。
また、似たような名前も合わせて、空白にする場合もあります。

このフェーズでは、とにかく効果があるまで、空白にしまくります。

3.レーザー治療を行います。

最後に、効果があるレジストリが分かったので、仮想レジストリの
初期値を空白にするように対処しておきます。
今回の場合は、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\114000001E872D116BF00006799C897E\Features
ProductNonBootFiles
です。

変更前:


変更後:


  Value=ProductNonBootFiles
  REG_SZ~#2300
にします。REG_SZ~#2300が空白の意味です。
最後にBuild.batを実行し、仮想アプリを再作成します。
その後、Sandboxを削除して動作確認を行います。

副作用について
私の経験上、この方法で副作用が発生したことは、ありません。
仮想レジストリを変更するため、実際のレジストリや実際にインストールされているアプリには
影響がないためだと思います。
※とは言え、自己責任でお願いしますね。


MSI修復処理で止まってしまう問題への対策(2012/08/09追加):
MSIの修復処理が動作していると、エラーが発生したり
修復処理が固まったようになってしまいます。
固まらずに、処理を終わらせるための対処は、以下になります。
一瞬表示されるだけで、MSIのインストール画面が自動的に終了するようになります。


HKEY_LOCAL_MACHINE.txtに以下の内容を追加します。



isolation_full HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSIServer
  Value=ImagePath
  REG_EXPAND_SZ~"%SystemSystem%\msiexec.exe" /V#2300



参考:
http://blogs.vmware.com/thinapp/2012/04/solving-msi-self-repair-issues-in-thinapp.html
ThinAppBlogとは若干対処方法が違いますが、ほぼ同じです。
あちらのほうがより、繊細にレーザー照射を行なっていますね。

ちなみに、私はこの方法を会得するのに3年掛かりました。

スギ花粉症について:
緩和するお米を研究されているリンクです。期待
http://www.nias.affrc.go.jp/gmo/basic.html
一般的解説バージョン
http://www.nias.affrc.go.jp/gmo/simple.html
詳細解説バージョン
http://www.nias.affrc.go.jp/gmo/basic.html


もっと知りたい花粉症のレーザー治療
http://trendy.nikkeibp.co.jp/article/special/20101215/1033943/