C ++: создание снимка экрана Windows Logon Screen / UAC Prompts без отключения UAC - PullRequest
0 голосов
/ 17 ноября 2018

Я искал ответ на этот вопрос по всему Интернету, но на него, похоже, не было прямого ответа, поэтому я подумал, что спрошу.

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

Что касается чтения, проб и ошибок, моя текущая настройка выглядит следующим образом:

  • Программа работает как служба Windows
  • Получает токен активного пользователя
  • Запускает CreateProcessAsUser с токеном пользователя для создания другого собственного экземпляра
  • Делает снимок экрана и передает его обратно по каналам.

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

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

По сути, мне интересно, как именно TeamViewer добивается такого рода достижений? Он может без проблем переключаться между экраном входа в систему и сеансом пользователя, а также захватывает запросы UAC. Мне очень любопытно, как это достигается.

Спасибо всем!

1 Ответ

0 голосов
/ 17 ноября 2018

По совету Дэвисона я выяснил, как это сделать, и он включает в себя несколько шагов.

Во-первых, необходимо создать CreateProcessAsUser для создания процесса в сеансе консоли (получено из WTSGetActiveConsoleSessionId),Следует отметить, что этот процесс должен иметь административные привилегии, которые просто не удастся получить с помощью маркера пользователя.Обходной путь, очевидно, заключается в том, чтобы получить дескриптор процесса, выполняющегося с административными привилегиями, получить токен этого процесса, продублировать его и использовать его с CreateProcessAsUser.Для этого я использовал Winlogon.

После этого все остальное довольно просто;используйте OpenInputDesktop, чтобы получить дескриптор рабочего стола, который в данный момент видит пользователь (это будет значение по умолчанию для реального рабочего стола и Winlogon для запроса UAC и экрана входа в систему).После этого используйте SetThreadDesktop, чтобы установить поток ваших процессов на соответствующий рабочий стол и сделать снимок экрана.Предполагая, что у вашего Процесса есть привилегии для создания дескриптора на рабочий стол Winlogon, вы сможете захватить экран входа в систему / приглашения uac и рабочий стол обычного пользователя.

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

...