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

Автоматизация запуска Delphi-приложения с повышенными привилегиями в Windows

Delphi , ОС и Железо , Windows

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

Проблема Разработчик программного обеспечения для Windows столкнулся с необходимостью автоматического запуска своего приложения, состоящего из драйвера ядра, подписанного с использованием расширенного сертификата (EV), и графического интерфейса пользователя, написанного на Delphi. Приложение требует запуска с повышенными привилегиями для старта драйвера и выполнения других задач, требующих повышенных прав. Необходимо найти способ запускать программу при старте операционной системы без отображения запроса UAC.

Исследованные варианты решений

  1. Запуск .exe из драйвера ядра - исследователь указывает, что нет документированного способа запуска процесса пользовательского уровня из ядра.

  2. Создание отдельной службы пользовательского уровня - предполагается, что службы пользовательского уровня освобождены от UAC. Можно создать службу, которая будет запускать .exe, используя функцию CreateProcessAsUser(), и затем завершать свою работу.

  3. Конвертация .exe в службу пользовательского уровня - аналогично второму варианту, но вместо создания отдельного .exe для службы, предполагается преобразование текущего GUI-приложения для работы как служба.

  4. Преимущества использования EV-сертификата - исследователь задается вопросом, предоставляет ли EV-сертификат какие-либо преимущества для выполнения задачи.

  5. Поиск лучшего способа - разработчик ищет альтернативные методы решения проблемы.

Альтернативный ответ и подтвержденное решение В комментариях предложено использовать простой подход, имея GUI-часть и службу, работающую под учетной записью System, и установить IPC между ними. Если GUI-часть потребует выполнения действий с повышенными привилегиями, она может попросить службу выполнить эти действия.

Подтвержденное решение заключается в использовании Планировщика задач Windows для запуска приложения с максимально возможными привилегиями. Создание задачи, которая будет запускаться при входе пользователя в систему, позволяет выполнить это. Можно указать конкретный пользовательский аккаунт для запуска приложения, что позволит использовать привилегии этого аккаунта.

Пример кода на Object Pascal (Delphi) Пример кода для создания задачи в Планировщике задач Windows обычно не требуется, так как это делается через графический интерфейс. Однако, если необходимо автоматизировать процесс создания задачи, можно использовать API Windows, например, функцию ITaskService::RegisterTaskDefinition.

procedure TForm1.CreateTaskServiceTask(const TaskName, ExePath: string; const UserName, Password: string);
var
  TaskService: ITaskService;
  TaskFolder: ITaskFolder;
  TaskDefinition: ITaskFolder3;
  RegistrationInfo: ITaskRegistrationInfo;
  Credentials: ITaskCredentials;
  User: ITaskUser;
  ProcessStartInfo: IProcessStartInfo;
begin
  CoCreateInstance(TASKSERVICE, NIL, CLSCTX_INPROC_SERVER, ITaskService, TaskService);
  TaskService.GetFolder('\', TaskFolder);
  TaskService.QueryInterface(IID_ITaskFolder3, TaskDefinition);
  TaskDefinition.CreateTaskFolder(TaskName, User, TaskFolder);
  TaskDefinition.QueryInterface(IID_ITaskFolder, TaskFolder);
  TaskFolder.CreateTask(TaskName, TaskDefinition);
  TaskDefinition.QueryInterface(IID_ITaskDefinition, TaskDefinition);
  TaskDefinition.Get(TaskDefinition);
  RegistrationInfo := TaskDefinition.GetRegistrationInfo;
  RegistrationInfo.ActionsClsid := TASK_ACTION_CONDITION;
  RegistrationInfo.ActionsAll := False;
  Credentials := TaskDefinition.GetCredentials;
  User := Credentials.GetUser(0, UserName, Password);
  ProcessStartInfo := TaskDefinition.GetProcessStartInfo;
  ProcessStartInfo.Path := ExePath;
  ProcessStartInfo.Arguments := '';
  ProcessStartInfo.WorkingDirectory := ExtractFilePath(ExePath);
  RegistrationInfo := TaskDefinition.GetTrigger;
  RegistrationInfo.SetTriggerAndProperties(TRIGGER_AT, TRIGGER_TIME_LOGON, TRIGGER_USER, User);
  RegistrationInfo := TaskDefinition.Get;
  RegistrationInfo.Flags := RegistrationInfo.Flags or TASK_LOGON_INTERACTIVE_TOKEN;
  RegistrationInfo.Save();
end;

Этот код предназначен для демонстрации и должен быть адаптирован под конкретные нужды и используемую версию Delphi.

Заключение Автоматический запуск Delphi-приложений с повышенными привилегиями в Windows можно реализовать с помощью Планировщика задач Windows, что позволит избежать отображения запроса UAC. Использование сервисов и IPC также может быть полезным в некоторых случаях, но основной акцент следует сделать на использовании Планировщика задач как наиболее удобного и безопасного способа решения данной проблемы.

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

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


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

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




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:39:11/0.0033800601959229/0