2010年10月01日

「このプログラムは正しくインストールされなかった可能性があります」を回避する方法 (Windows 7, Vista)

はてなブックマークに登録

Windows 7 や Vista で UAC を有効にしていると、たまに原因のよくわからないメッセージに遭遇することがあります。 プログラムをインストールした時に「このプログラムは正しくインストールされなかった可能性があります」というメッセージを目にしたことはありませんか?


実際にプログラムを動かしてみると異常のない場合が多いのですが、不審に思いネットを検索してみると非常に多くのページが見つかります。検索結果の見出しを眺めながらあれこれ覗いてみると、どうやらこのメッセージはソフトウェアの利用者だけでなく開発者にとってもちょっとしたジレンマのようです。
今回は、このメッセージが表示される原因とプログラム側での回避方法を調べてわかったことを書いてみます。

■ 結論


細かい説明の前に、まず 32bit のテストプログラムを使って実験した結果をまとめておきます。実験では次のすべての条件に該当した場合に Windows が件のメッセージを表示しました。

  • Windows ログオンセッションが UAC 環境下にある
  • 当該プログラムは HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall (アンインストール情報)下のキーへの登録を行わない
  • 当該プログラム名に「install」「setup」「update」等の文字列が含まれる
  • (Vista のみ)当該プログラムにマニフェストがリンクされていない、または、マニフェストに管理者権限への昇格指定が記述されていない
  • (7 のみ)上の「(Vista のみ)」での内容がいずれも OK でも、マニフェストに 7 互換指定が記述されていない
「アンインストール情報の操作有無」「exeファイル名での所定のキーワードの有無」「マニフェスト内容」の各条件を組み合わせると、プログラムは 12 のパターンに分かれます。下の表は、この 12 種類のテストプログラムを使って Vista, 7 で確認を行った結果の一覧です。「OUT!」は例のメッセージが表示されたことを示します。
Uninstall 情報 「Install」等の文字列 Manifest Vista 7 7 (x64)
登録しない exe 名に含む なし OUT ! OUT ! OUT !
昇格のみ safe OUT ! OUT !
昇格+互換 safe safe safe
exe 名に含まない なし (*1) safe safe safe
昇格のみ safe safe safe
昇格+互換 safe safe safe
登録する exe 名に含む なし safe safe safe
昇格のみ safe safe safe
昇格+互換 safe safe safe
exe 名に含まない なし (*1)         (*2)
昇格のみ safe safe safe
昇格+互換 safe safe safe
(*1) このパターンでは権限昇格要求が発生しません
(*2) 権限昇格されないため HKLM 配下へアンインストール情報を書き込む時点で失敗します

■ このメッセージが表示される理由


Windows Vista で登場した UAC (User Account Control) の目的のひとつは、ユーザの意図しないプロセスがログオンセッションを悪用してシステムに害を及ぼす危険を抑止することです。そのため、現在のログオンユーザが管理者権限を持っていても、あるプログラムを管理者権限で実行するためにはユーザが明示的にそれを許可する必要があります。

一方、Windows 環境へ所定のプログラムを登録することを目的とする「インストーラ」は、その性質上多くの場合システムの深部にアクセスする処理を内包しています。そのため通常は管理者権限で実行されなければなりません。そこで問題となるのは、インストーラ側がユーザに権限昇格を求めるための実装を持っていないケースです。こうしたインストーラが標準ユーザの権限のままで実行されれば処理中にエラーが発生しユーザの混乱を誘発することでしょう。

そうした状況を回避するために、UAC には所定のプログラムがインストーラであるか否かを自動的に判別し、必要に応じてユーザに当該プログラムの権限昇格を確認するしくみがあります。その基準の中に「ファイル名による判定」があります。具体的には、実行ファイルの名前に「install」「setup」「update」等の文字列が含まれていれば Windows はそのプログラムをインストーラと判断します。

このしくみによってインストーラと判断されユーザ確認を経て昇格したプロセスの挙動は「プログラム互換性アシスタント」Program Compatibility Assistant :以下 PCA)によってモニタされます。ここで当該プロセスがインストーラとして適切な処理を行わずに終了した場合、PCA は「このプログラムは正しくインストールされなかった可能性があります」 (This program might not have installed correctly) のダイアログを表示してユーザに対処方法を尋ねます。
ダイアログでの選択肢について (上記リンク先 MSDN 記事より引用)
  • 「推奨の設定を使用して再インストールする」
    セットアップが正常に完了しなかった場合に選びます。このオプションを選択すると、「Windows XP SP2 互換モード」を使用して、セットアップを再度実行します。
  • 「このプログラムは正しくインストールされました」
    セットアップが正常に完了した場合に選びます。たとえ、セット アップが正しく完了しても、PCA によってダイアログが表示されることがあります。ここで、ユーザーがこのオプションを選択しておくと、次回から PCA ダイアログが表示されないように設定することができます。
  • キャンセル
    PCA は何も処理を行いません。
この措置は、Windows によってインストーラと判断されたプログラムのプロセスが、「プログラムの追加と削除」 (Add or Remove Programs = ARP) へ アンインストール用の情報を登録せずに終了した場合に発動します。アンインストール用の情報とは、レジストリの HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 以下の所定のキーとデータです。ここに登録された内容が、コントロールパネルから利用できる「プログラムの追加と削除」のユーザインターフェイスに反映されます。つまり、Windows はインストーラの標準の所作として「アンインストール情報」がシステムへ登録されることを重要視しているわけですね。

■ 対策


上記の事情により、インストーラにはアンインストール用の情報を正しく登録・削除する処理を含むべきです。登録時に最低限必要なのは、HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 配下に一意に識別できる ID でキーを作成し、その配下に以下の二項目を用意することです。 (参考情報)
  • [DisplayName]
    REG_SZ 型:「プログラムの追加と削除」一覧に表示される名前
  • [UninstallString]
    REG_SZ 型:アンインストール処理のためのコマンドライン文字列
あわせて、インストーラにはマニフェストファイルをリンクするべきです。権限昇格要求の含まれるマニフェストが実行モジュールに存在すれば、Windows は前述の「プログラムがインストーラであるか否かの自動的な判別」を行いません。そのため PCA による干渉を受けません。

なお、Windows 7 対応のためにはこれに加えてマニフェストにもうひとつ情報要素を加味する必要があります。それは、Compatibility セクションです。ここに Windows 7 互換の旨を記述します。 (参考情報)
以下に、権限昇格要求と Windows 7 互換宣言を含むマニフェスト記述例を示します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="*"
  name="Test"
  type="win32"
/>
<description>Test</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
      <requestedPrivileges>
          <requestedExecutionLevel level="requireAdministrator"/>
      </requestedPrivileges>
 </security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
  </application>
</compatibility>
</assembly>
※マニフェストのリンクはインストーラ開発環境から指定するか、あるいは Windows SDK に含まれる MT.EXE(Manifest Tool) を使えばビルドずみバイナリにも対応できます。(詳細記事)

あらためて冒頭の「■ 結論」の項をご参照下さい。列挙した 12 パターンの意味を把握することができるでしょう。

■ テストプログラム


今回の実験で使用したテストプログラムのビルドずみバイナリとソースコード(C 言語)・マニフェストファイルを公開します。 README.txt に記載された注意事項を確認の上ご利用下さい。 テストプログラムのダウンロード

■ 最後に


この記事での実験結果は、仕様上 Windows 7, Vista で意図どおりに動作すると考えられる必要最小限の実験用プログラムを使って得られたものです。 したがって、今回使用したプログラムの内容に含まれない要素をもつ他のプログラムが Windows の所作に別の影響を及ぼす可能性もあります。あらかじめご了承下さい。
(tanabe)
klab_gijutsu2 at 16:36│Comments(8)win 

この記事へのトラックバック

1. Windowsアプリのインストール後のエラー  [ ASARI.JP : Diary ]   2012年04月25日 00:17
Windows Vista以降、インストーラーを使ってアプリケーションをインストールすると「このプログラムは正しくインストールされなかった可能性があります」といったメッセージを目にすることがあります。どういった条件で出るのだろうと以前から気になっていたのですが、腰を据

この記事へのコメント

1. Posted by 通りすがり   2014年05月13日 23:26
5 大変参考になりました。
別途ダウンロードしておいた更新プログラムを実行してoffice2003の更新を行おうとしたところ、件のメッセージが表示され「一体何事か」と慌ててアレコレと知らべていて此処に辿り着きました。
私の環境ではUACはオフで、なおかつ.exeファイル名に「install」「setup」「update」等が含まれない状況でも発生しました。
とりあえず更新プログラム側の表示が「更新プログラムは正常に適用されました」でしたので無視することにしましたが、Microsoftさんは、せめて「自社製品」同士では、こういった警告は出ないようにしておく事くらいの対策は徹底してもらいたいものです。
2. Posted by tanabe   2014年05月14日 04:39
興味深い話題をありがとうございます。Vista はユーザにとってもベンダにとっても大きな分岐点となりましたね。
3. Posted by セキワダ   2014年09月18日 22:01
5 有用で詳細な記事をありがとうございます。
大変参考になりました
4. Posted by tanabe   2014年09月19日 05:42
コメントをありがとうございます。記事がお役に立ち幸いです。
5. Posted by 通りすがり   2016年05月18日 15:06
5 ほんとありがとうございます。大変助かりました!
「TorisetuProgram.exe」のようなファイル名になっていました。「setuP」これがイケなかったようです。
6. Posted by tanabe   2016年05月18日 15:30
コメントをありがとうございます。意外な盲点ですね。ずっとシンプルだった頃の Windows が懐かしいです。
7. Posted by 通りすがりの名無し   2017年10月26日 17:29
4 大変参考になりました。

当方で実験したところ、Win7sp1(最新updateインストール済)ファイル名が全然違っていても、レジストリをいじると、マニフェストだけでは対応できませんでした。Uninstall情報をレジストリに登録しなければなりません。
8. Posted by tanabe   2017年10月27日 01:49
コメントをありがとうございます。もう手元に検証環境はありませんが、この記事へアクセスされた方の参考情報になればと思います。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント