Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему манифест UAC не активируется после добавления его в PE через код

Delphi , Файловая система , Ресурсы

При разработке программ на языке Delphi, разработчики часто сталкиваются с необходимостью повышения уровня привилегий для своих приложений. Одним из способов достижения этого является добавление манифеста UAC (User Account Control), который позволяет указать системе, что для запуска приложения требуются администраторские права. В данной статье мы рассмотрим, почему манифест UAC может не активироваться после его добавления в исполняемый файл (PE) с помощью кода на Object Pascal, и как исправить эту проблему.

Оригинальный вопрос и контекст

Разработчик столкнулся с проблемой, что после добавления манифеста UAC в исполняемый файл с помощью кода на Delphi, манифест не активируется. При этом, если манифест добавить вручную, все работает корректно. Пример кода, который не работает:

procedure TForm1.Button1Click(Sender: TObject);
var
    myRes: THandle;
    test: PChar;
begin
    test := '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + #13#10 +
             //... остальная часть манифеста ...
    myRes := BeginUpdateResource('testuac.exe', False);
    UpdateResource(myRes, MakeIntResource(24), '1', 1033, test, Length(test));
    EndUpdateResource(myRes, False);
    ShowMessage(SysErrorMessage(GetLastError));
end;

Анализ проблемы

Проблема заключается в том, что манифест UAC добавляется в исполняемый файл с использованием неверного идентификатора ресурса. Для манифеста UAC необходимо использовать определенный идентификатор, который активируется при запуске приложения.

Подтвержденный ответ

Чтобы манифест UAC активировался, необходимо использовать идентификатор ресурса CREATEPROCESS_MANIFEST_RESOURCE_ID, который имеет значение 1. Это можно сделать, изменив вызов функции UpdateResource следующим образом:

UpdateResource(myRes, MakeIntResource(1), '1', 1033, test, Length(test));

Это изменение соответствует рекомендациям Microsoft, изложенным в документации по созданию процесса с указанием манифеста ресурса.

Пример исправленного кода

procedure TForm1.Button1Click(Sender: TObject);
var
    myRes: THandle;
    test: PChar;
begin
    test := '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + #13#10 +
             //... остальная часть манифеста ...
    myRes := BeginUpdateResource('testuac.exe', False);
    UpdateResource(myRes, MakeIntResource(1), '1', 1033, test, Length(test));
    EndUpdateResource(myRes, True); // Используйте True для сохранения изменений
    ShowMessage('Манифест UAC успешно добавлен в файл testuac.exe');
end;

Обратите внимание, что параметр fSave в функции EndUpdateResource должен быть установлен в True, чтобы изменения были сохранены.

Заключение

При добавлении манифеста UAC в PE-файл через код на Delphi важно использовать правильный идентификатор ресурса. В данном случае, использование MakeIntResource(1) вместо MakeIntResource(24) позволяет корректно активировать манифест при запуске приложения. Следуя этим рекомендациям, разработчики смогут успешно интегрировать манифесты UAC в свои проекты, обеспечивая необходимый уровень привилегий для их приложений.

Создано по материалам из источника по ссылке.

Разработчик сталкивается с проблемой неактивации манифеста UAC в исполняемом файле после добавления его через код на Delphi, и ищет решение, используя правильный идентификатор ресурса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ресурсы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:57:30/0.0034530162811279/0