C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: インストーラのメンテナンス画面の修復を無効にしたい


(過去ログ 129 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■76307 / inTopicNo.1)  インストーラのメンテナンス画面の修復を無効にしたい
  
□投稿者/ コッテ (1回)-(2015/06/23(Tue) 16:12:25)

分類:[.NET 全般] 

こんにちは。
VS2008のセットアッププロジェクトを使ってインストーラを作成していますが、
このセットアッププロジェクトでは、カスタム動作を使用しています。

このため、ソフトのインストール後、再度このmsiを実行すると
インストーラーはメンテナンス画面(修復/削除を行う)を表示しますが、
ここで修復を選択してしまうと、カスタム動作の処理が無視されてしまい、
意図したインストールがなされません。

そこで、Orcaを使ってmsiの内容を直接変更しようと思い、
[RadioButton]テーブルのMaintenanceForm_Actionプロパティに関する
修復用ラジオボタンアイテムの行を削除してみましたが、
こうすると、インストーラのメンテナンス画面が表示される時に

「このパッケージをインストールするときに予期しないエラーが検出されました。
 このパッケージは問題がある可能性があります。エラーコードは2855です。」

というメッセージが表示され、インストーラーがうまく動作してくれません。

メンテナンス画面のラジオボタンのデフォルトを[削除]にすることはできました
([Property]テーブルのMaintenanceForm_Actionプロパティの値を"Remove"にする)が、
修復ラジオボタンを非表示または無効にすることはできるのでしょうか?

よろしくお願いします。
引用返信 編集キー/
■76308 / inTopicNo.2)  Re[1]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ とっちゃん (298回)-(2015/06/23(Tue) 18:29:25)
とっちゃん さんの Web サイト
No76307 (コッテ さん) に返信

> VS2008のセットアッププロジェクトを使ってインストーラを作成していますが、
> このセットアッププロジェクトでは、カスタム動作を使用しています。
>
> このため、ソフトのインストール後、再度このmsiを実行すると
> インストーラーはメンテナンス画面(修復/削除を行う)を表示しますが、
> ここで修復を選択してしまうと、カスタム動作の処理が無視されてしまい、
> 意図したインストールがなされません。
>
修復へのルートを見た目見せないことは可能ですが、自動修復が働いた場合に同じ状況になるので
カスタム動作をメンテナンス画面でも動くように修正したほうがよいと思います。

普通に組み込んでいれば、カスタム動作はスキップしないはずなんですがね。。。
修復時は発動しないとかあったかな?

> そこで、Orcaを使ってmsiの内容を直接変更しようと思い、
> [RadioButton]テーブルのMaintenanceForm_Actionプロパティに関する
> 修復用ラジオボタンアイテムの行を削除してみましたが、
> こうすると、インストーラのメンテナンス画面が表示される時に
>
> 「このパッケージをインストールするときに予期しないエラーが検出されました。
>  このパッケージは問題がある可能性があります。エラーコードは2855です。」
>
> というメッセージが表示され、インストーラーがうまく動作してくれません。
>
> メンテナンス画面のラジオボタンのデフォルトを[削除]にすることはできました
> ([Property]テーブルのMaintenanceForm_Actionプロパティの値を"Remove"にする)が、
> 修復ラジオボタンを非表示または無効にすることはできるのでしょうか?
>
出来ないわけではありませんが、確かラジオは2個以上ないとだめだったはずなので
ラジオを出さない形にページを「作り変える」必要があると思います。

すでにチェック済みだと思いますが、ラジオコントロールのリファレンスも張っておきますね。
https://msdn.microsoft.com/en-us/library/aa370958.aspx


ただ、そこまでカスタマイズするとなると、ORCAでちょこちょこっと修正してというレベルでは
無くなってくるので、ビルドツールそのものも考えたほうがいいのでは?となってくると思います。

引用返信 編集キー/
■76312 / inTopicNo.3)  Re[2]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (2回)-(2015/06/24(Wed) 11:04:45)
コッテです。
とっちゃん様、アドバイスありがとうございました。
自動修復については全く頭にありませんでした。
また、色々とググると、msiファイルの右クリックでの「修復」なんてのもあり、
これもノーチェックでした...

今回の「修復」で何が問題なのかを確認しました。
初回インストール時にはユーザー情報画面でシリアルナンバーを入力できるようにしていますが、
さらにこの画面をカスタマイズし、追加情報を入力できるようにしています。
(msiのカスタマイズにはOrcaを使用しています。)

これら情報はカスタム動作でレジストリ(HKEY_LOCAL_MACHINE\SOFTWARE配下)に書込を行っていますが、
修復時にはこれらが登録されない(書き込まれた情報が消去されてしまう?)状態となってしまいます。

このため、修復が発生した時には、強制的にキャンセルするか、
初回インストール時のユーザー情報画面から開始できるようにしたいのですが、
これはやはりハードルが高いでしょうか?


ところで、初回インストール時にはUAC画面が表示されるのですが、修復時にはUACも出ず、
初回インストール時に設定したレジストリも書き替わってしまいます。
目的がインストール済みソフトの修復のため、UACが管理するまでもない、ということなのでしょうか?
引用返信 編集キー/
■76313 / inTopicNo.4)  Re[3]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (3回)-(2015/06/24(Wed) 13:02:12)
コッテです。
カスタム動作をさらに確認したところ、Commitの時に、
・ユーザー情報に入力がある場合にはその内容をレジストリに書き込む
・ユーザー情報がなければ該当項目をレジストリより削除する

ということをやっていました。

「修復」の時には上記レジストリ操作を行わないようにすれば問題は解決しそうですが、
今のインストールが初回インストールなのか修復なのかをCommitメソッド内で判断することは可能でしょうか?
引用返信 編集キー/
■76314 / inTopicNo.5)  Re[4]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ とっちゃん (299回)-(2015/06/24(Wed) 13:45:08)
とっちゃん さんの Web サイト
No76312 (コッテ さん) に返信

> 自動修復については全く頭にありませんでした。
> また、色々とググると、msiファイルの右クリックでの「修復」なんてのもあり、
> これもノーチェックでした...
>
他にも、追加と削除の画面にも修復ボタンってあります。こちらはmsi的には設定すれば消せますが。
(ARPNOREPAIR プロパティ:https://msdn.microsoft.com/en-us/library/aa367592.aspx)

> 今回の「修復」で何が問題なのかを確認しました。
> 初回インストール時にはユーザー情報画面でシリアルナンバーを入力できるようにしていますが、
> さらにこの画面をカスタマイズし、追加情報を入力できるようにしています。
> (msiのカスタマイズにはOrcaを使用しています。)
>
これ、ビルド時に毎回手動でセットしてるんですか?
スクリプトを使って、機械的に処理したほうがいいような。。。
Windows SDK に、WiRunSQL.vbs というスクリプトがあります。
こいつを使って手動設定してる内容を記述してやれば、ビルド時に自動処理ができます。


> これら情報はカスタム動作でレジストリ(HKEY_LOCAL_MACHINE\SOFTWARE配下)に書込を行っていますが、
> 修復時にはこれらが登録されない(書き込まれた情報が消去されてしまう?)状態となってしまいます。
>
No76313 (コッテ さん) に返信
> コッテです。
> カスタム動作をさらに確認したところ、Commitの時に、
> ・ユーザー情報に入力がある場合にはその内容をレジストリに書き込む
> ・ユーザー情報がなければ該当項目をレジストリより削除する
>
> ということをやっていました。
>
ここですよね。

いくつか回避パターンがありますが、一応王道的なものとしては、
起動条件(セットアッププロジェクトのコンテキストメニューから出せます)にある
対象コンピュータの検索で、ユーザーが入力した情報を再度そのまま取り込めるように
しておく方法がお勧めです。

これを作っておくと、何もない場合にはプロパティがセットされず、
値が入っていれば、その値をプロパティに設定してくれます。

この仕組みをうまく使って、修復時にあってほしいはずの既存情報を吸い上げてくるということを行います。

単純にインストール済みか?だけなら、Installed プロパティで判断することもできます。
インストール済みなら、カスタム動作の処理をスキップするとかもありだと思います。


> このため、修復が発生した時には、強制的にキャンセルするか、
> 初回インストール時のユーザー情報画面から開始できるようにしたいのですが、
> これはやはりハードルが高いでしょうか?
>
強制的にキャンセルは、エラーカスタムアクション(https://msdn.microsoft.com/en-us/library/aa368078.aspx)を設定して
それを適切な状況で呼び出すことで処理できます。
ただし、チェックが不十分だと、アンインストールでもエラーメッセージを出すので、シャレにならんことになります。
でも、正しくチェックができていれば、修復だけブロックすることは可能です。

でも、修復時にUIを出せるかどうかとなると話が変わります。
右クリックで出てきた修復や、追加と削除にある修復は、UIが出ませんし、出せません。
(BasicUIモードというWindowsInstallerエンジンが提供するUIを使うため)
なので、この場合はユーザー情報画面を出せるようにしてあっても出てくることはありません。



>
> ところで、初回インストール時にはUAC画面が表示されるのですが、修復時にはUACも出ず、
> 初回インストール時に設定したレジストリも書き替わってしまいます。
> 目的がインストール済みソフトの修復のため、UACが管理するまでもない、ということなのでしょうか?

インストール済みの msi を使って操作する場合は、インストール時に許可しているので、出ません。
でも、Win7だったか、Win8からだったはず。
それまでは、署名が行われていて、なおかつ、msi の内部にも署名情報が埋め込まれている場合は出なくなるだったはず。。。


引用返信 編集キー/
■76318 / inTopicNo.6)  Re[5]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (4回)-(2015/06/25(Thu) 10:43:19)
コッテです。
とっちゃん様、いつもありがとうございます。

> いくつか回避パターンがありますが、一応王道的なものとしては、
> 起動条件(セットアッププロジェクトのコンテキストメニューから出せます)にある
> 対象コンピュータの検索で、ユーザーが入力した情報を再度そのまま取り込めるように
> しておく方法がお勧めです。

なるほど、早速調べてみます。
貴重な情報、誠にありがとうございました。


> これ、ビルド時に毎回手動でセットしてるんですか?
> スクリプトを使って、機械的に処理したほうがいいような。。。
> Windows SDK に、WiRunSQL.vbs というスクリプトがあります。
> こいつを使って手動設定してる内容を記述してやれば、ビルド時に自動処理ができます。


ご指摘の通り、ビルドする頻度が多いのであれば、スクリプトも検討するのですが、
実際には、差替または追加用のテーブルデータを予め用意し(内容は固定)、
これらをOrcaでインポートするだけの作業なので、
スクリプトを用意するまでには至っていない、というのが現状です。


でも、何だか光が見えてきました。
結果が出ましたら、またご報告します。
引用返信 編集キー/
■76321 / inTopicNo.7)  Re[5]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (5回)-(2015/06/25(Thu) 12:26:53)
度々失礼します。

ところで、

> 単純にインストール済みか?だけなら、Installed プロパティで判断することもできます。
> インストール済みなら、カスタム動作の処理をスキップするとかもありだと思います。

このInstalledプロパティは、何のプロパティでしょうか?
もしこれが使えるようであれば、インストール済みかどうかの判断にしようと思います。
ただ、Installedプロパティというものが現バージョンのインストーラー固有のものであればいいのですが、
そうでないならば、このインストーラーではRemovePreviousVersionをTrueにしているので、
旧バージョンがインストールされている状態でこれがTrueになるようであれば、
別の方法を考えないといけない、ということですよね。
引用返信 編集キー/
■76323 / inTopicNo.8)  Re[6]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ とっちゃん (300回)-(2015/06/25(Thu) 17:36:25)
とっちゃん さんの Web サイト
No76321 (コッテ さん) に返信
>>単純にインストール済みか?だけなら、Installed プロパティで判断することもできます。
>>インストール済みなら、カスタム動作の処理をスキップするとかもありだと思います。
>
> このInstalledプロパティは、何のプロパティでしょうか?

起動したmsiのProductCodeの製品は、すでにインストールされているか?を判定するプロパティです。
https://msdn.microsoft.com/en-us/library/aa369297.aspx
ユーザーが設定を変えられるものではなく、システムが自動的にセットします。

ProductCodeを基準に判定するので、VSセットアップではサポートしていない、パッチ作成や
MinorUpgrade でも Installed <> "" となります。

でも、ProductCodeの違う、MajorUpgrade(VSセットアップが唯一サポートするアップデート方式)では
Installed は未定義となります(存在しないプロパティ)。


> もしこれが使えるようであれば、インストール済みかどうかの判断にしようと思います。
> ただ、Installedプロパティというものが現バージョンのインストーラー固有のものであればいいのですが、
> そうでないならば、このインストーラーではRemovePreviousVersionをTrueにしているので、
> 旧バージョンがインストールされている状態でこれがTrueになるようであれば、
> 別の方法を考えないといけない、ということですよね。

自分の目で確認したい場合は、ログを取得してその内容をチェックしてください。
ログの取得は、コマンドラインで
msiexec /i <msiのパス> /l*v <logファイルのパス>
として、実行することで簡単に取得できます。

このパラメータで起動して、最初の画面が出たらそこでキャンセル終了し
お持ちの手ごろなテキストエディタで、ログファイルを開いて
Installed を検索してみると結果がわかります。

実際にインストールしたらどうなるか?という点では、サンプル用に適当なインストーラを作成しビルドして

1.インストールしていない時
2.インストール後にもう一度実行した時
3.バージョンを上げてビルドして、実行した時

の3種類のログをとってみるとよいと思います。
他にもチェックに使えるプロパティがいろいろあるので、条件判定などで、参考にできると思います。

また、それと併せてInstallUISequence Table(Sequenceでソートするとわかりやすい)と突き合わせてみると
インストーラの動きがわかると思います。

引用返信 編集キー/
■76326 / inTopicNo.9)  Re[7]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (6回)-(2015/06/26(Fri) 13:31:43)
コッテです。
とっちゃん様、ご丁寧にお付き合い頂き、ありがとうございます。
教えて頂いた情報を元に、色々と確認してみます。
結果が出ましたら、またご報告します。
また何かありましたら質問させてください。

引用返信 編集キー/
■76337 / inTopicNo.10)  Re[8]: インストーラのメンテナンス画面の修復を無効にしたい
□投稿者/ コッテ (7回)-(2015/06/29(Mon) 17:05:45)
コッテです。
あれから色々と検討しましたが、
よく考えたら、現在はカスタム動作のコミット時に
入力情報をもとに生成したコードをレジストリに書き込み、
カスタム動作のアンインストール時にはこれを削除するということを行っていたので、
このタイミングでバージョン情報(を含むデータ)を
レジストリに登録・削除することにしました。

これなら、
・初回インストール…レジストリにバージョン情報がない、または
 インストーラーのバージョンがレジストリ登録バージョンより新しい

・修復…インストーラーのバージョンとレジストリ登録バージョンが同一

ということで判別できそうです。
(インストーラーのバージョンがレジストリ登録バージョンより古い場合は、
 インストーラーでエラーメッセージが出るので、ここでは考慮しません。)


もしかしたら、この方法は王道ではないのかも知れませんが、
元々、これらタイミングでレジストリ操作を行っていますので、
対応は容易でした。

本件はこれにて解決とさせて頂きますが、もしかしたら、
「わざわざレジストリ登録なんてしなくても」というご意見もあろうかと存じますので、
引き続きアドバイスを頂けるとありがたいです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -