Недавно в чат пришел человек с вопросом по статье Как выполнять задачи с полными правами обычным пользователем без ввода пароля администратора. У него не отображалось окно приложения, которое пользователь запускал на сервере изложенным в материале способом. Как правило, я очень внимательно отношусь к сообщениям о том, что мои инструкции не работают. Но на сей раз я не стал особо вникать, потому что автор вопроса старательно создавал дыру в безопасности сервера.
Я сослался на предупреждение жирным шрифтом в статье не использовать этот метод для интерактивных приложений и перевернул страницу. Тем более проблема участника была в другом. Там местного разработчика нужно было побольнее пнуть, чтобы его поделка не требовала прав администратора без нужды. Как-никак уже прошло 16 лет с выхода Vista и дебюта UAC, пора уже освоить грамотные подходы.
[+] Сегодня в программе
Невидимое приложение и Session 0
Об этом случае я вспомнил на днях, когда столкнулся с аналогичной проблемой, решая совсем другую задачу. Права администратора у меня были, но запуск приложения из планировщика не отрабатывал. Присмотревшись к списку процессов, я увидел там заветное приложение. Пусть это будет cmd для демонстрации.
Обратите внимание на столбец SI. Это Session ID — идентификатор сеанса. Вошедшие в систему интерактивные пользователи получают ИД сеанса 1, 2, 3 и т.д. А Session 0 – специальный изолированный сеанс для процессов, которыми владеет система и службы Windows. Он появился в Windows Vista с целью укрепления безопасности ОС.
Работающие в пользовательском сеансе процессы не могут взаимодействовать с процессами из Session 0. Это предотвращает атаки на более привилегированные процессы. Читайте про Session 0 Isolation, например, у Руссиновича: Windows Internals, Fifth Edition, Chapter 4.
В этом случае процесс запустился фактически как служба, хотя и от имени моего пользователя, что можно увидеть с параметром -IncludeUserName.
Одновременно с изоляцией сеанса 0 в Windows Vista добавили службу Interactive Services Detection (UI0Detect) для поддержки обратной совместимости в старых программах, пытающихся взаимодействовать с пользователем из нулевого сеанса. Но ее выпилили в Windows 10 за ненадобностью.
Кстати, планировщик — не единственный способ запуска процесса в сеансе 0. Можно воспользоваться psexec Руссиновича:
psexec -i 0 -d notepad
Теперь понятно, почему окно не отображается. Но почему у нас с читателем приложения запускались из планировщика в сеансе 0?
Настройки выполнения запланированного задания
Мы одинаково задали один параметр наших заданий, хотя и преследовали разные цели.
Запланированные задания были настроены запускаться для всех пользователей!
Действительно, читатель просто следовал моей инструкции. Но там все так и было задумано. Ведь по условиям задачи нужно было реализовать работу задания в планировщике вне зависимости от того, выполнен ли вход с административной учетной записью.
У меня же была своя причина. Недавно я показывал в канале такой подход к настройке запланированного задания, чтобы не мигало консольное окно. И вообще не подумал о том, что скроется окно интерактивного приложения.
Нет, конечно, я тестировал. Но у меня такие задачи не подразумевают взаимодействия с программами. Скрипт запустился, отработал — финиш. А тут я добавил к скрипту обслуживания еще и запуск приложения и… наступил на свои же грабли :)
Заключение
В периоды взрывного роста курса биткойн в чате несколько раз всплывал вопрос запуска приложения незаметно для неопытного пользователя — окна нет и ладно, майним потихоньку. Теперь вы знаете способ :)
Возвращаясь же к вопросу читателя, я лишь порадовался, что он, не вняв моим предупреждениям, уперся в настоящую границу защищенной зоны Windows (security boundary). Иначе бы у него на сервере сейчас простые пользователи гоняли приложения с правами администратора.
Обсуждение завершено.