EXEマニフェストファイルのカスタマイズ方法

Windows EXEマニフェストをカスタマイズして、アプリの権限を制御し、DPIアウェアを有効化し、セキュリティを強化します。デフォルトのマニフェストをリソースツールで編集して、ロバストな実行と信頼管理を実現します。

EXEマニフェストファイルのカスタマイズ

Customizing an EXE Manifest File

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のソフトウェアを長年使っています。シンプルで使いやすいからです。

Image1

必要な昇格レベルの変更

デフォルトのアプリケーションマニフェストは必要な昇格レベルをasInvokerとして宣言しています。これはアプリケーションが親プロセスと同じ昇格レベルを持つことを意味します。Windows管理者権限レベルに昇格させたい場合は、requestedExecutionLevelタグのlevel属性の値をasInvokerからrequireAdministratorに変更してください。

これはTrustInfo<security>タグ内に追加できます。ここで要求される実行レベルLeveluiAccessの両方を指定します:

<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とその動作を説明する表があります。

Table

注意: 管理者権限レベルでアプリを実行するにはユーザーが管理者権限または資格情報を持っている必要があります。

詳しくは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 - 世界をより良い場所に 🌎

I just do cybersecurity stuff.

ディスカッション

コメントを残す

ゲストコメントはサイトに表示される前に審査されます。

まだコメントはありません。最初のコメントを残してディスカッションを始めましょう!

提案やバグの報告がありますか?お問い合わせください!