Настройка файла манифеста 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>
Создание собственного файла манифеста приложения
Для этого вам нужна программа Resources hacker/inspector, которая позволяет изменить манифест файла EXE.
Я лично использую программу Ангуса Джонсона уже долгое время, потому что она простая и удобная.
Изменение уровня требуемого повышения привилегий
Стандартный манифест приложения указывает уровень требуемого повышения как 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 : Ниже приведена таблица, объясняющая уровень, указанный в манифесте приложения, и его поведение
Примечание: Пользователю всё равно потребуются права администратора или соответствующие учетные данные для запуска приложения с уровнем привилегий администратора.
Подробнее об этом можно узнать на сайте 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 - Делаем мир лучше 🌎
Обсуждение
Оставить комментарий
Комментарии гостей будут проверены перед публикацией на сайте.
Пока нет комментариев. Будьте первым, кто начнет обсуждение!