Windows アプリケーションのマニフェスト ファイルのカスタマイズ

提供: RAD Studio
移動先: 案内検索

作成できるマルチデバイス アプリケーションの種類 への移動

アプリケーションの配置:概要 への移動


Windows をターゲット プラットフォームとするプロジェクトをビルドすると、RAD Studio によって自動的にアプリケーション マニフェスト ファイルが追加されます。 このデフォルトのアプリケーション マニフェスト ファイルを基に、カスタム アプリケーション マニフェスト ファイルを作成することができます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <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>
</assembly>

デフォルトのアプリケーション マニフェスト ファイルでは、以下が定義されています。

  • サポートする Windows コモン コントロールのバージョン
  • アプリケーションの昇格レベル(親プロセスと同じ)

カスタム アプリケーション マニフェスト ファイルの作成

  1. 空のテキスト ファイルを作成します。
  2. そこにデフォルトのアプリケーション マニフェストをコピーします。
  3. 依存関係を追加または変更します(必要な昇格レベルDPI 認識機能など)。
  4. .manifest という拡張子でテキスト ファイルを保存します。

必要な昇格レベルの宣言

デフォルトのアプリケーション マニフェストでは、必要な昇格レベルは asInvoker と宣言されています。 つまり、アプリケーションの昇格レベルは親プロセスと同じです。

アプリケーションを Windows 管理者権限レベルに昇格したい場合には、requestedExecutionLevel タグの level 属性の値を、asInvoker から requireAdministrator に変更します。

メモ: このように変更した場合でも、アプリケーションを管理者権限レベルで実行するには、ユーザーが管理者権限または資格情報を持っている必要があります。

次の表は、アプリケーション マニフェストで宣言した必要な昇格レベルとアプリケーションの親プロセスのレベルとの一般的な組み合わせについて、アプリケーションがどのように動作するかをまとめたものです。

アプリケーション マニフェストで宣言されたレベル 親プロセスのレベル 動作
asInvoker 標準ユーザー アプリケーションは標準ユーザーとして起動します
asInvoker 管理者 アプリケーションは完全な管理者アクセス権で起動します
highestAvailable 標準ユーザー アプリケーションは標準ユーザーとして起動します
highestAvailable 管理者 アプリケーションは完全な管理者アクセス権で起動します
requireAdministrator 標準ユーザー アプリケーションを実行する前に管理者資格情報を入力する画面が表示されます
requireAdministrator 管理者 アプリケーションは完全な管理者アクセス権で起動します

さまざまな設定におけるアプリケーションの動作の詳細は、「MSDN: Create and Embed an Application Manifest (UAC)」(MSDN: アプリケーション マニフェストの作成と組み込み(UAC))を参照してください。

DPI 認識機能の宣言

DPI 対応アプリケーションを作成するには、アプリケーション マニフェストで DPI 認識機能を宣言する必要があります。たとえば、アプリケーションでモニタごとの DPI 認識を行うと宣言するには、</assembly> 終了タグの前に以下を追加します。

<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
   <asmv3:windowsSettings
        xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
     <dpiAware>True/PM</dpiAware>
   </asmv3:windowsSettings>
</asmv3:application>

DPI 認識機能についての詳細や、アプリケーション例、コード例については、Delphi Developers Guide 4K.pdf(4K ディスプレイ向け Delphi 開発者ガイド)を参照してください。

アプリケーションへのカスタム マニフェスト ファイルの追加

  1. [プロジェクト|オプション...|アプリケーション]と遷移し、[アプリケーション]オプション ページを開きます。
  2. ターゲット プラットフォームと構成の組み合わせを選択します。
  3. [カスタム][自動生成]ドロップダウン コンボ ボックスから選択します。
  4. [カスタム マニフェスト]フィールドの省略ボタン [...] をクリックして、自分のカスタム .manifest ファイルを選択します。
メモ: アプリケーション オプションは、「プラットフォーム-構成」ペアごとに固有です。プラットフォームと構成の組み合わせごとに、明示的にカスタム マニフェストを設定する必要があります(同じ .manifest ファイルでも構いません)。

トラブルシューティング

管理者権限のテスト

アプリケーションで管理者レベルの権限が必要かどうか(および正しく付与されているかどうか)を、以下のコードで簡単にテストすることができます。アプリケーションの必要な昇格レベルrequireAdministrator と宣言し、以下の手続きを実行します。

Delphi の場合:
uses
System.Win.Registry, Winapi.Windows;
procedure isAdmin();
var
  reg: TRegistry;
  openResult: Boolean;
begin
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.Access := KEY_WRITE;
  openResult := reg.OpenKey('Software\MyCompanyName\MyApplication\',True);
  if not openResult = True then
    begin
    MessageDlg('Unable to write to registry. Your application does NOT have Administrator level privileges.',
                TMsgDlgType.mtError, mbOKCancel, 0);
    end
  else
    begin
    MessageDlg('Write to registry permitted. Your application has Administrator level privileges.',
                TMsgDlgType.mtInformation, mbOKCancel, 0);
    end;
  reg.CloseKey();
  reg.Free;
end;
C++ の場合:
#include <System.Win.Registry.hpp>
#include <Winapi.Windows.hpp>
void __fastcall isAdmin(TObject *Sender){
	TRegistry *reg;
	bool openResult;
	reg = new TRegistry(KEY_READ);
	reg->RootKey = HKEY_LOCAL_MACHINE;
	reg->Access = KEY_WRITE;
	openResult = reg->OpenKey("Software\\MyCompanyName\\MyApplication\\" , true);
	if (openResult != true){
		MessageDlg("Unable to write to registry. Your application does NOT have Administrator level privileges.",
					TMsgDlgType::mtError, mbOKCancel, 0);
	}else{
		MessageDlg("Write to registry permitted. Your application has Administrator level privileges.",
					TMsgDlgType::mtInformation, mbOKCancel, 0);
	}
	reg->CloseKey();
	reg->Free;
}

アプリケーションから以下のいずれかのメッセージが表示されます。

  • Unable to write to registry. Your application does NOT have Administrator level privileges.(レジストリに書き込めません。アプリケーションに管理者レベルの権限がありません。)
  • Write to registry permitted. Your application has Administrator level privileges.(レジストリへの書き込みが許可されました。アプリケーションに管理者レベルの権限があります。)

このテストが機能するのは、レジストリの HKEY_LOCAL_MACHINE\Software の部分に書き込むには管理者レベルの権限が必要だからです。このコードは、実際にレジストリに書き込みを行うわけではなく、書き込み権限を要求しているだけです。

アプリケーションをビルドした後、必ず、IDE を使用せずに実行してください。IDE はデフォルトで管理者レベルの権限でアプリケーションをデバッグするためです(アプリケーション マニフェストは守られません)。

エラー

Unable to create process: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.(プロセスを生成できません: side-by-side 構成が正しくないため、アプリケーションを開始できませんでした。アプリケーション イベント ログを見るかコマンドライン ツール sxstrace.exe を使用して詳細を確認してください。)

  • 通常、このエラーは、アプリケーション マニフェストのどこかに間違った値を入力したことを示しています。 マニフェストの形式と指定した値がすべて正しいことを確認してください。
メモ: アプリケーション マニフェストを変更したら、アプリケーションをビルドして変更を適用してください。

Unable to create process. The requested operation requires elevation(プロセスを生成できません。要求された操作を行うには昇格が必要です)

  • 標準ユーザーとして IDE を実行しているときに、管理者レベルの権限が必要なアプリケーションをデバッグしようとすると、このエラーが発生します。 管理者レベルの権限が必要なアプリケーションをデバッグするには、IDE を管理者として実行するしかありません。

関連項目