Windows アプリケーションのマニフェスト ファイルのカスタマイズ
アプリケーションの配置:概要 への移動
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 コモン コントロールのバージョン
- アプリケーションの昇格レベル(親プロセスと同じ)
目次
カスタム アプリケーション マニフェスト ファイルの作成
- 空のテキスト ファイルを作成します。
- そこにデフォルトのアプリケーション マニフェストをコピーします。
- 依存関係を追加または変更します(必要な昇格レベルや DPI 認識機能など)。
.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 開発者ガイド)を参照してください。
アプリケーションへのカスタム マニフェスト ファイルの追加
- [プロジェクト|オプション...|アプリケーション]と遷移し、[アプリケーション]オプション ページを開きます。
- ターゲット プラットフォームと構成の組み合わせを選択します。
- [カスタム]を[自動生成]ドロップダウン コンボ ボックスから選択します。
- [カスタム マニフェスト]フィールドの省略ボタン [...] をクリックして、自分のカスタム
.manifest
ファイルを選択します。
.manifest
ファイルでも構いません)。トラブルシューティング
管理者権限のテスト
アプリケーションで管理者レベルの権限が必要かどうか(および正しく付与されているかどうか)を、以下のコードで簡単にテストすることができます。アプリケーションの必要な昇格レベルを requireAdministrator
と宣言し、以下の手続きを実行します。
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;
#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 を管理者として実行するしかありません。
関連項目
- 4K ディスプレイ向け Delphi 開発者ガイド(DPI 問題の解決、カスタム マニフェストの作成)(英語版)