EXEマニフェストファイルのカスタマイズ
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>
カスタムアプリケーションマニフェストファイルの作成
そのためには、EXEファイルのマニフェストを変更できるリソースハッカー/インスペクタープログラムが必要です。
私は個人的にAngus Johnsonのソフトウェアを長年使っています。シンプルで使いやすいからです。
必要な昇格レベルの変更
デフォルトのアプリケーションマニフェストは必要な昇格レベルをasInvoker
として宣言しています。これはアプリケーションが親プロセスと同じ昇格レベルを持つことを意味します。Windows管理者権限レベルに昇格させたい場合は、requestedExecutionLevel
タグのlevel属性の値をasInvoker
からrequireAdministrator
に変更してください。
これはTrustInfo
の<security>
タグ内に追加できます。ここで要求される実行レベルにLevel
とuiAccess
の両方を指定します:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
-
uiAccess
-
false — アプリケーションはデスクトップ上の別ウィンドウのUIに入力を送る必要がありません。アクセシビリティ提供をしないアプリはfalseに設定すべきです。オンスクリーンキーボードなど、他のウィンドウに入力を送る必要があるアプリはtrueに設定してください。
-
true — アプリケーションはUI保護レベルをバイパスして権限の高いデスクトップウィンドウに入力を送ることができます。この設定はUIアクセシビリティアプリだけで使用すべきです。
-
-
Level : ここにアプリケーションマニフェストで宣言されたLevelとその動作を説明する表があります。
注意: 管理者権限レベルでアプリを実行するにはユーザーが管理者権限または資格情報を持っている必要があります。
詳しくはMicrosoftのドキュメントサイトをご覧ください : /MANIFESTUAC (Embeds UAC information in manifest)
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>
管理者権限のテスト
以下のコードスニペットは、アプリケーションが管理者レベルの権限を要求し正しく付与されているかの簡易テストに使えます。アプリケーションの昇格レベルをrequireAdministrator
に設定し、次の手続きを実行してください。
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("レジストリへの書き込みができません。アプリケーションは管理者レベルの権限を持っていません。",
TMsgDlgType::mtError, mbOKCancel, 0);
}else{
MessageDlg("レジストリへの書き込みが許可されました。アプリケーションは管理者レベルの権限を持っています。",
TMsgDlgType::mtInformation, mbOKCancel, 0);
}
reg->CloseKey();
reg->Free;
}
-
アプリケーションは以下のいずれかのメッセージを表示します:
-
レジストリへの書き込みができません。アプリケーションは管理者レベルの権限を持っていません。
-
レジストリへの書き込みが許可されました。アプリケーションは管理者レベルの権限を持っています。
-
このテストが動作するのは、HKEY_LOCAL_MACHINE\Software
レジストリ部分に書き込むには管理者レベルの権限が必要なためです。
スニペットは実際にはレジストリに書き込みを行わず、書き込み許可だけを要求します。
アプリケーションをビルドし、IDEの外で実行してください。なぜならIDEはデフォルトで管理者権限でアプリをデバッグするため(アプリケーションマニフェストを無視するため)です。
© 2021 - Sofiane Hamlaooui - 世界をより良い場所に 🌎
ディスカッション
コメントを残す
ゲストコメントはサイトに表示される前に審査されます。
まだコメントはありません。最初のコメントを残してディスカッションを始めましょう!