2011年10月31日月曜日

仮想アプリとUACについて(裏技あり)

仮想アプリとUACについて(裏技あり)


Windows Vista から搭載された、UACについて



Windows Vista からUACが搭載されました。
アプリを起動しようとすると、以下のような画面が表示されることがあると思います。





アプリを仮想化していると、この画面が問題になる事があります。

・起動時の問題
起動時に「はい」クリックしないと
いけないとか、管理者のID/PWを
入れなきゃいけないとか

・アプリの挙動に影響を与える
昇格( UAC )することによりアプリの動作が変更される。中途半端な状態で起動してしまう。


UAC の動作を設定するのは、アプリケーションマニフェストと呼ばれる物になります。
大きく分けると以下の3パターンで UAC の挙動を制御します。
・EXE自体に埋め込む場合
・ファイルとしてEXEと同じフォルダに設置
・アプリケーションの互換モードにより設定(EXEを右クリックして管理者として実行等)


UAC の実行モードは以下の3つから選択します。
・RequireAdministrator (管理者として実行)
管理者権限を持つユーザーの場合は、昇格を行う画面が表示されます。
一般ユーザーの場合は、管理者のID/PWを入力する画面が表示されます。
・HighestAvailable(持ちうる最高の権限で実行)
管理者権限を持つユーザーの場合は、昇格を行う画面が表示されます。
一般ユーザーの場合は、UACの画面が表示されずにアプリが起動します。
・RunAsInvoker(そのままの権限で実行)
UACの画面が表示されずにアプリが起動します。


このUACのポップアップを表示させないための対処方法は、何個かあります。

  • Windows OSの設定から UAC を無効にしてしまう。
     最終手段なので、いきなりこれは厳しいですね。せっかくの防御用の盾を捨てると
     ウイルスに対して感染しやすくなってしまいます。
  • 対象のEXEファイルに埋め込まれている、アプリケーションマニフェスト(Application Manifest)を変更する。
    ResourceHacker等を使って書き換えます
    level="highestAvailable"またはrequireAdministratorの部分を
    RunAsInvokerへ変更

  • EXE名にSetup/Install/Update等の予約後が含まれている場合は、EXE名を変えてしまう。
  • EXEに埋込まれたアプリケーションマニフェストがない場合は、EXE名.manifestを作成してしまう。
  • 最後の手段(裏技) 環境変数に以下を追加する
変数名: __COMPAT_LAYER
変数値: RunAsInvoker
※__COMPAT_LAYERのはじめの2文字は_アンダースコア 2つです。
      Webを検索した限りでは、非公開のパラメータ?みたいです。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
仮想アプリに環境変数を組み込む方法について

UACの昇格画面を抑えこむために __COMPAT_LAYER を使うのが手軽です。
また、OS全体orログインユーザーに設定するよりも、対象のアプリケーションの実行時だけ
有効になる方が、良いと思います。

せっかくアプリを仮想化しているので
対象の仮想アプリの実行時だけUACの昇格画面を無効にする方法については
次回書きたいと思います。

次回予告: 仮想アプリケーションに、環境変数を設定する方法について
ThinApp / App-V 両製品とも環境変数を柔軟にカスタマイズ可能です。


ThinApp / App-V 環境変数を設定する方法

http://tunemicky.blogspot.jp/2011/11/thinappapp-v.html


参考: