Delphi – предоставить права администратора на приложение

Вопрос: Я использую Inno Setup для создания App Installer. Он успешно устанавливает приложение, но я могу запустить его только как Администратор. Поскольку я не хочу, чтобы пользователь щелкнул правой кнопкой мыши файл exe и выбрал "Запуск от имени администратора", мне интересно, есть ли какой-либо простой способ предоставить привилегии администратора самому приложению или, наоборот, предоставить эти

Вопрос:

Я использую Inno Setup для создания App Installer. Он успешно устанавливает приложение, но я могу запустить его только как Администратор. Поскольку я не хочу, чтобы пользователь щелкнул правой кнопкой мыши файл exe и выбрал “Запуск от имени администратора”, мне интересно, есть ли какой-либо простой способ предоставить привилегии администратора самому приложению или, наоборот, предоставить эти привилегии по коду. Благодарю.

Лучший ответ:

Интересно, есть ли простой способ предоставить привилегии администратора самому приложению

Вы должны предоставить манифест контроля учетных записей для вашего приложения, которое имеет свою requestedExecutionLevel значение, установленное в requireAdministrator.

Создайте текстовый файл с расширением .manifest и поместите в него следующий XML:

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes»?> <assembly xmlns=»urn:schemas-microsoft-com:asm.v1″ manifestVersion=»1.0″> <assemblyIdentity version=»1.0.0.0″ processorArchitecture=»*» name=»MyAppAssemblyNameHere» type=»win32″/> <description>My App Description</description> <!— uncomment this to enable ComCtl v6 Visual Styles… <dependency> <dependentAssembly> <assemblyIdentity type=»win32″ name=»Microsoft.Windows.Common-Controls» version=»6.0.0.0″ processorArchitecture=»*» publicKeyToken=»6595b64144ccf1df» language=»*»/> </dependentAssembly> </dependency> —> <trustInfo xmlns=»urn:schemas-microsoft-com:asm.v2″> <security> <requestedPrivileges> <requestedExecutionLevel level=»requireAdministrator» uiAccess=»false»/> </requestedPrivileges> </security> </trustInfo> </assembly>

Создайте текстовый файл с расширением .rc файла и привяжите его к файлу .manifest:

1 24 «myapp.manifest»

Скомпилируйте файл .rc файл .res с помощью командной строки brcc32.exe.

brcc32 myapp.rc

В своем проекте откройте ” Проект”> “Параметры”> “Приложение” и снимите флажок “Включить теги времени выполнения”. Это отключает декларацию по умолчанию Delphi, которая позволяет использовать только ComCtl v6 Visual Styles (поэтому вам нужно включить стили вручную в пользовательском манифесте).

Теперь добавьте скомпилированный файл .res в ваш проект и выполните сборку.

или, наоборот, предоставлять эти привилегии по коду.

Не прямо, нет. Повышение UAC происходит только при запуске процесса. Как только процесс запущен, он не может быть повышен динамически. Однако то, что вы МОЖЕТЕ сделать:

  1. вызовите ShellExecute/Ex() с глаголом «runas» чтобы запустить другую копию вашего приложения с дополнительным параметром командной строки (или отдельным .exe) для выполнения вашей административной логики по мере необходимости. «runas» поднимет этот процесс, даже если он не имеет манифеста UAC. Если вашему основному приложению нужно дождаться завершения процесса администрирования, он может указать флаг SEE_MASK_NOCLOSEPROCESS для ShellExecuteEx() а затем использовать функцию WaitForSingleObject() или связанную функцию, чтобы ждать возвращенной HANDLE, которая будет сигнализироваться при выходе из запущенного процесса.

  2. переместите административную логику в COM-объект, который ваш основной.exe может создавать в повышенном состоянии, используя COM Elevation Moniker, когда это необходимо.

Таким образом, вашему основному .exe не нужно использовать манифест requireAdministrator, который вы всегда должны стараться избегать, если только вам не нужно, чтобы все приложение запускалось с правами администратора.

Оцените статью
Добавить комментарий