Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2008年10月08日] [更新 2018年07月16日] Delphi 一般・その他
   
アプリケーションマニフェストの作成と使用
動作確認等 Windows Vista 以降
[整理番号 - 332]







Windows Vista 以降ではアプリケーションマニフェストが必須


Windows Vista 以降の Windows で動作させるアプリケーションにはアプリケーションマニフェストが必須であると考えて差し支えありません.そのアプリケーションマニフェストの作成方法と使用に関する説明記事です.
アプリケーションマニフェストファイルの拡張子は .manifest です.





アプリケーションマニフェストの作成方法


[アプリケーションマニフェスト] をリソースとして EXE に組み込んでおけば,実行時に,管理者への昇格ダイアログ (ユーザアカウント制御ダイアログ) を自動的に表示させることができます.

以下の手順で作成しますが,Delphi 7 以前には [ランタイムテーマ] の設定はありません.Delphi 7 では uses に XPman を追加しておきます.

  • (1) [プロジェクト] [オプション] の [アプリケーション] で [ランタイムテーマ] を有効にする
  • (2) プロジェクトをコンパイルして EXE を作成する
  • (3) その EXE をリソースエディタで開き,[XP Theme maifest] のコードを開く
  • (4) そのコードをコピーして,テキストエディタに貼り付ける
  • (5) level="asInvoker" を level="requireAdministrator" に変更する
  • (6) これを UTF-8 形式で,plXRAY.manifest 等の名前で保存する (plXRAY の部分は任意)

アプリケーションマニフェストに,要求実行レベル属性 (requestedExecutionLevel 要素の level 属性) が含まれている場合,レジストリの仮想化やファイルの仮想化の機能は,そのアプリケーションでは無効になります.



[備考 1]
一般的には,アプリケーションにはアプリケーションマニュフェストを組み込むべきです.
ただし,旧いバージョンの Delphi では,アプリケーションマニフェストを使用する場合と,使用しない場合とでアプリの挙動が異なることがあります.特に描画関係に注意が必要です.

[備考 2]
Delphi 10.1 Berlin 等,より新しいバージョンの Delphi であれば,本項で述べている手順は必要ありません.メニューの [プロジェクト] [オプション] のダイアログで [アプリケーション] で設定できます.
[マニュフェストファイル] を自動生成にすれば,自動的に EXE に組み込まれます.また,[管理者権限の有効化] をチェックすれば,作成した EXE を起動すると自動的に管理者への昇格ダイアログを表示します.どのようなマニュフェストファイルができるかは,以下のサンプルを使用すると確認できます.


リスト1
Vista 以降の UAC に対応するためのアプリケーションマニフェストファイルの例
このコードはコピーして使用可能だが,UTF-8 で保存する必要がある
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="DelphiApplication"
    version="1.0.0.0" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--Windows 10-->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      <!--Windows 8.1-->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
      <!--Windows 8-->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
      <!--Windows 7-->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
      <!--Windows Vista-->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
    </application>
  </compatibility>
</assembly>


表1
マニフェストの <requestedExecutionLevel/> 要素の値

level="asInvoker" プロセスを作成するユーザと同じトークンを使用してプロセスを起動する
level="highestAvailable" 管理者は,昇格の同意を求められる
ユーザに管理者権限がないと,標準ユーザとして起動される
level="requireAdministrator" 管理者は,昇格への同意を求められる
標準ユーザは「管理者への昇格」のためのログインダイアログが表示される


<requestedExecutionLevel> 要素の uiAccess 属性は False となっています.デジタル署名を取得していないアプリケーションでは Falas にします.デジタル署名を取得したアプリケーションは True にすることにより,UIPI の制限を回避することができます.
デジタル署名のないアプリケーションで True にしても,警告ダイアログが表示されて起動しません.

なお,Windows 7 で新しく追加された compatibility 要素がないマニフェストを使用したアプリケーションは,Windows Vista 互換モードで動作します.詳しくは以下のリンクの記事内の [Windows Vista 互換モードの解除] の項を参考にしてください.



図1
EXEを作成
  • [プロジェクト]
  • [オプション]
  • [アプリケーション]
  • [ランタイムテーマ] を有効にしてコンパイル
図2
マニフェストのコード
  • EXE ファイルをリソースエディタで表示
  • [XP Theme manifest] のコードをコピペして UTF-8 で保存
    拡張子を.manifest とする
  • あるいは [リソースを外部に保存] で保存




アプリケーションマニフェストの使用方法 - Delphi XE 以前


作成したマニフェストファイルは次のようにしてプロジェクトで使用しますが,Delphi 7 以降で uses に XPMan があれば削除しておきます.

  • 下のコードのようなリソースファイルを作成して XXX.rc の名前で保存 (XXX の部分は任意)
  • このリソースファイルをプロジェクトに追加
  • [プロジェクト][オプション] の [アプリケーション] で [ランタイムテーマ] を無効にする
  • プロジェクトをコンパイルして EXE を作成する
拙作のコンポーネント類,サンプルプログラム集には,[管理者として実行] であることを前提に作成されているものが多くあります.一部のサンプルでは,アプリケーションマニフェストを使用して,[ユーザアカウント制御] ダイアログを起動時に自動表示するようになっています.

マニフェストファイルの内容を変更したり,リソースファイルの内容を変更した場合は,プロジェクトの再構築が必要となることがあります.


マニフェスト .manifest を EXE に埋め込むためのリソースファイル
ここでは plXRAY.rc の名前で保存
1 24 "plXRAY.manifest"


図3
プロジェクトフォルダ内に保存
図4
プロジェクトに追加
  • plXRAY.rc をプロジェクトに追加
  • プロジェクトをコンパイル
図5
プロジェクトマネージャーでも可能
  • この図では既に plXRAY.rc は追加済み
  • manifest ファイルを変更したら [再構築]




アプリケーションマニフェストの使用方法 - Delphi XE2 以降


Delphi XE2 の場合は,リソースファイルを作成する必要はありません.[ランタイムテーマ] を [カスタムマニフェストを使用する] にして,作成したマニフェストファイルを指定するだけです.

マニフェストファイルの内容を変更したり,リソースファイルの内容を変更した場合は,プロジェクトの再構築が必要となることがあります.


[備考 1]
Delphi 10.2 Tokyo 等では更に簡単になっています.[マニフェストファイル] を [自動生成] にすれば,マニフェストファイルを作成する必要はありません.管理者権限での実行が必要であれば,[実行レベル] を [管理者権限が必要にする] だけです.
この時,EXE に埋め込まれるマニフェストコードには,開発環境に関係なく,[supportedOS] のタグには Windows 10 までの設定が記述されます.

[備考 2]
Delphi XE8 以前では,[ランタイムテーマを有効にする] の設定でコンパイルしても,作成されるアプリケーションマニフェストには <application> の supportedOS のコードは作成されません.Windows 10 に対応するためには,カスタムマニュフェストを作成して使用する必要があります.


図6
Delphi XE2 の場合




アプリケーションマニフェストの設定で仮想化を無効にできる


アプリケーションが,アプリケーションマニフェストを使用してして,そのマニフェストに要求実行レベル属性 (requestedExecutionLevel 要素の level 属性) が含まれている場合,レジストリの仮想化やファイルの仮想化の機能は,そのアプリケーションでは無効になります.
なお,64 ビットのアプリケーションでは,レジストリとファイルの仮想化は行われません.