Win7: インストーラーの PCA 対策

Windows Vista で導入された機能の 1 つに「インストーラーの検出機能」があります。

  • 特定パターンに合致するプログラムをインストーラーとして検出する
  • ファイル名やリソースに特定の文字(setup、update、install など)を含む場合、インストーラーとみなす

インストーラーとして検出された場合には、OS が自動的に権限昇格を提供して、管理者権限で実行されるように
なります。そして、インストーラーがエラーとなった場合には、PCA(Program Compatibility Assistant)が
介入して、互換アシスタントダイアログ を表示します。

ちなみに、互換アシスタントダイアログ に表示される ”プログラム” や ”発行元” は、バージョンリソースから持ってきます。
バージョンリソースがないと ”不明” と表示されてしまいます。

インストーラープロセスに対して、PCA が動作する条件ですが、

  • UAC で権限昇格している
  • プログラムの追加と削除への登録がない
  • 32bit プログラム
  • マニフェストにより実行権限を指定していない

というものがあります。(なお、この機能はクライアント OS のみになります)
インストーラーの動作確認や開発を行う場合には、必ず、頭に入れておかなければなりません。

ところが、Windows 7 からは、上記の条件に

  • Windows 7 ネイティブモードではない(マニフェストの Compatibility セクションで Windows 7 の指定がない)

というものが加わります。
Compatibility セクションについては、以前の記事「アプリケーション マニフェスト」を参照してください。

やっかいなのが、インストーラーを途中でキャンセルしても PCA が働いてしまうということです。

では、互換アシスタントダイアログ を表示されないようにする対策方法ですが、もうお気づきの通りで、

インストーラーをWindows 7 ネイティブモードで動くようにする

しかありません。
つまり、インストーラーの埋め込みマニフェストに Compatibility セクションを追加するわけです。
(必ず、埋め込みマニフェストにする必要があります)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
・・省略・・
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
<!--Windows 7--> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> </application> </compatibility> </assembly>

こんな感じで、プログラムの実行レベルと一緒に Compatibility セクションを記述したマニフェストを
インストーラーに埋め込むことになります。

なお、supportedOS ですが、上記に Windows Vista である

<!–Windows Vista–>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />

を記述して supportedOS が 2 つになった場合ですが、Windows 7 では、Windows 7 ネイティブを優先します。
そのため、2 つ書いても意味がないです。
Windows Vista では、そもそも Compatibility セクションがサポートされていませんので無視されるだけです。
(もちろん、Vista より前の OS でも同様です)

PCA の 互換アシスタントダイアログ が表示されると見た目もかっこ悪く、何よりも、ユーザーは

”これ、本当に Windows 7 対応しているのだろうか?”

と疑問を持ちますからね。
Windows 7 対応するインストーラーは、マニフェストに Compatibility セクションを追加するようにしましょう。

参考情報

追記(2009.09.15)
Tech Fielders コラムに参考情報が記載されたと MS エバの方より連絡を受けました(ありがとー)。

チェックしておくといいと思います。

インストーラー開発に InstallShield を使用している場合には、

を見ておいてください。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。