Настройка файла манифеста 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>

Создание собственного файла манифеста приложения

Для этого вам нужна программа Resources hacker/inspector, которая позволяет изменить манифест файла EXE.

Я лично использую программу Ангуса Джонсона уже долгое время, потому что она простая и удобная.

Image1

Изменение уровня требуемого повышения привилегий

Стандартный манифест приложения указывает уровень требуемого повышения как asInvoker. Это означает, что ваше приложение будет иметь тот же уровень привилегий, что и родительский процесс. Если вы хотите повысить уровень привилегий приложения до уровня администратора Windows, просто измените значение атрибута level в теге requestedExecutionLevel с asInvoker на requireAdministrator.

Вы можете добавить это в секцию TrustInfo и тег <security>, добавив оба атрибута: Level и uiAccess в Requested Execution Level:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
  • uiAccess

    • false — Приложению не нужно направлять ввод в пользовательский интерфейс другого окна на рабочем столе. Приложения, не предоставляющие функции доступности, должны устанавливать этот флаг в false. Приложения, которым требуется направлять ввод в другие окна рабочего стола (например, экранная клавиатура), должны установить это значение в true.

    • true — Приложению разрешено обходить уровни защиты UI для направления ввода в окна с более высокими привилегиями на рабочем столе. Эта настройка должна использоваться только для приложений с поддержкой доступности UI.

  • Level : Ниже приведена таблица, объясняющая уровень, указанный в манифесте приложения, и его поведение

Table

Примечание: Пользователю всё равно потребуются права администратора или соответствующие учетные данные для запуска приложения с уровнем привилегий администратора.

Подробнее об этом можно узнать на сайте Microsoft Docs: /MANIFESTUAC (Встраивает информацию 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>

Тестирование прав администратора

Следующий фрагмент кода может служить быстрым тестом, требует ли ваше приложение уровень привилегий администратора (и правильно ли этот уровень предоставлен). Задайте необходимый уровень повышения вашего приложения как 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 - Делаем мир лучше 🌎

Получить ИИ-анализ этой статьи

Обсуждение

Оставить комментарий

Комментарии гостей будут проверены перед публикацией на сайте.

Пока нет комментариев. Будьте первым, кто начнет обсуждение!

Есть предложения или нашли ошибку? Свяжитесь с нами!