Проблема восстановления окна в приложении под учетной записью SYSTEM с помощью ShowWindow и альтернативные решения для Delphi
В данной статье мы рассмотрим проблему, с которой сталкиваются разработчики, работающие с технологиями Delphi и Pascal, при попытке восстановления окон приложений, запущенных под учетной записью SYSTEM, с использованием функции ShowWindow. Мы также предложим альтернативные решения, которые позволят решить данную проблему.
Описание проблемы
Разработчики часто сталкиваются с ограничениями безопасности, когда пытаются взаимодействовать с процессами, работающими под учетной записью SYSTEM, из приложений, запущенных под обычными пользовательскими аккаунтами. Одно из таких ограничений касается функции ShowWindow, которая не работает корректно, когда пытаются восстановить окно, запущенное под SYSTEM.
Вот пример кода на Object Pascal, который обычно используется для восстановления минимизированного окна:
ShowWindow(wHandle, SW_RESTORE);
Этот код работает без проблем, если окно запущено под учетной записью текущего пользователя. Однако, если окно запущено под SYSTEM, ShowWindow возвращает FALSE, и изменение настроек манифеста (например, установка атрибута "requiresAdministrator" или "asInvoker") не помогает.
Альтернативные решения
В качестве альтернативы, было предложено использовать функцию ChangeWindowMessageFilterEx, однако стоит отметить, что запуск графического приложения под учетной записью SYSTEM на рабочих столах пользователей может быть не лучшей практикой с точки зрения безопасности. Более безопасным и рекомендуемым решением является создание Windows-сервиса, который будет работать под учетной записью SYSTEM, и взаимодействие с ним через фронтенд.
Подтвержденное решение
Одно из подтвержденных решений заключается в создании потока с привилегиями "local system" в пользовательском приложении, после чего выполнение ShowWindow происходит в этом потоке. Для этого необходимо выполнить несколько шагов:
Программа отправляет идентификатор сессии сервису.
Сервис вызывает OpenProcessToken и DuplicateTokenEx для создания токена Local System.
Сервис изменяет сессию токена, используя SetTokenInformation.
Сервис создает дескриптор токена с помощью DuplicateHandle.
Сервис отправляет дескриптор программе.
Программа устанавливает токен потока с помощью SetThreadToken.
Разработчикам, работающим с Delphi и Pascal, важно понимать ограничения, связанные с безопасностью и привилегиями учетных записей. Приложения, запущенные под SYSTEM, требуют особого подхода при взаимодействии с графическим интерфейсом. Создание Windows-сервиса и использование потоков с привилегиями Local System являются эффективными и безопасными методами решения подобных проблем.
Описание: В статье рассматривается проблема и предлагаются решения для восстановления окон приложений, запущенных под учетной записью SYSTEM в Delphi, и взаимодействия с ними из приложений под обычными пользовательскими аккаунтами, с использованием приме
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.