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

Обход Учётных Прав: Запуск Приложений Delphi Без Администратора

Delphi , Рабочий стол , Рабочий стол

Проблема, с которой сталкиваются разработчики, работающие в повышенных правах (elevated user), заключается в том, что после выполнения операций, требующих административных прав, необходимо запустить приложение без этих прав. Это может быть необходимо для выполнения определенных действий, например, замены исполняемого файла, который находится в директории ProgramFiles, на новый, после чего требуется запустить исходное приложение уже без административных привилегий.

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

Решение проблемы

Для решения данной проблемы можно использовать функцию CreateProcess с параметром STARTUPINFOEX, который позволяет задать атрибуты процесса. В частности, атрибут PROC_THREAD_ATTRIBUTE_PARENT_PROCESS позволяет указать, что дочерний процесс должен запускаться без административных прав, даже если родительский процесс запущен с этими правами.

Пример кода на Object Pascal (Delphi) для запуска приложения без административных прав из повышенного процесса:

program RunUnelevatedApp;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows,
  Winapi.StdUser;

// Определение необходимых функций и констант для работы с атрибутами процесса
// ...

// Функция TryRunUnelevated для запуска приложения без административных прав
function TryRunUnelevated(const Prog: TFileName; const Tail: string; const StartupDir: string = ''): Boolean;
var
  H, PID: DWORD;
  Process: THandle;
  Size, cb: SIZE_T;
  P: PProcThreadAttributeList;
  SIEX: STARTUPINFOEX;
  PI: PROCESS_INFORMATION;
begin
  Result := FALSE;
  H := GetShellWindow;
  if H = 0 then
    Exit;
  if GetWindowThreadProcessID(H, PID) = 0 then
    Exit;
  Process := OpenProcess(PROCESS_CREATE_PROCESS, FALSE, PID);
  if Process = 0 then
    Exit;
  try
    InitializeProcThreadAttributeList(nil, 1, 0, Size);
    GetMem(P, Size);
    try
      if not InitializeProcThreadAttributeList(P, 1, 0, Size) then
        Exit;
      try
        if not UpdateProcThreadAttribute(P, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, Process) then
          Exit;
        FillChar(SIEX, SizeOf(STARTUPINFOEX), 0);
        SIEX.lpAttributeList := P;
        SIEX.StartupInfo.cb := SizeOf(STARTUPINFOEX);
        if not CreateProcess(PChar(Prog), PChar(Tail), nil, nil, FALSE, CREATE_NEW_CONSOLE or EXTENDED_STARTUPINFO_PRESENT, nil, POINTER(StartupDir), SIEX.StartupInfo, PI) then
          Exit;
      finally
        DeleteProcThreadAttributeList(P);
      end;
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    finally
      FreeMem(P);
    end;
  finally
    CloseHandle(Process);
  end;
  Result := TRUE;
end;

// Процедура RunUnelevated для обертки TryRunUnelevated с обработкой ошибок
procedure RunUnelevated(const Prog: TFileName; const Tail: string; const StartupDir: string = '');
begin
  if not TryRunUnelevated(Prog, Tail, StartupDir) then
    RaiseLastOSError;
end;

// ...

begin
  // Пример использования функции RunUnelevated
  RunUnelevated('C:\path\to\your\app.exe', '', 'C:\path\to\startup\directory');
  Readln;
end.

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

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

Альтернативный ответ

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

Комментарии

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

Заключение

Разработчикам, работающим с Delphi и Pascal, важно понимать, как можно управлять правами доступа процессов, что позволяет создавать более гибкие и безопасные приложения. Использование атрибутов процесса — это мощный инструмент, который может быть применен в различных сценариях для обеспечения корректного взаимодействия приложений с операционной системой.

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

Разработчики Delphi сталкиваются с необходимостью запустить приложение без административных прав после выполнения операций, требующих этих прав, используя функцию `CreateProcess` с атрибутом `PROC_THREAD_ATTRIBUTE_PARENT_PROCESS` для


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

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




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


:: Главная :: Рабочий стол ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 19:53:21/0.0046381950378418/1