C ++: создание снимка экрана Windows Logon Screen / UAC Prompts без отключения UAC

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

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

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

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

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

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

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

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

1

Решение

По совету Дэвисона я разобрался, как это сделать, и это включает в себя несколько этапов.

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

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

Еще раз спасибо Дэвисону, который указал мне правильное направление.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]