Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Внизкак сделать BitBlt Logon Screen a? Найти похожие ветки
← →
Tarantiono (2006-01-29 00:11) [0]Возникла проблема при попытке сделать снимок экрана LogonScreen"a и передать его на удалённый компьютер.
Есть интерактивный сервис (просьба не пинать, в моём случае нельзя без интерактива).
В сервисе создаётся DC таким образомCreateDC(PChar("DISPLAY"), nil, nil, nil);
Итак, включаем удалённый компьютер, дожидаемся появления Logon Screen"a пробуем сделать снимок и передать по сети... команда успешно выполняется (соединение устанавливается, данные передаются) - получаем белый экран.
(внимание! CreateDC уже вызвана, больше её за всё время эксперемента не вызываем)
Залогинимся под первым пользователем - делаем снимок - картинка есть...
Делаем Logoff.
Появляется Logon Screen
Логинимся под вторым пользователем - делаем снимок - всё отлично! картинка есть.
Так как же перехватить (bitblt) Logon Screen из интерактивного сервиса?
Прошу мастеров разьяснить сабж или кинуть ссылки по данной тематике. В MSDN давольно много информации по WindowStation"ам и Desktop"ам, но цельной картины по моему сабжу составить для себя не могу.
Спасибо.
← →
Джо © (2006-01-29 00:23) [1]Не уверен, но может получится подключиться к Window Station посредством вызова
SetProcessWindowStation
?
← →
Tarantiono (2006-01-29 00:35) [2]
> Джо © (29.01.06 00:23) [1]
Только что испробовал такую связку
OpenInputDesktop
SetThreadDesktop
Помогло!
Но теперь возник вопрос... как отловить появление Logon экрана и наоборот его исчезновение из интерактивного сервиса?
← →
kaZaNoVa © (2006-01-29 00:36) [3]а может просто надо пытаться делать bitblt изнутри Winlogon.exe (внедренной DLL) ? (таким образом, например ужаётся ставить хук туда..)
← →
Tarantiono (2006-01-29 01:02) [4]
> kaZaNoVa © (29.01.06 00:36) [3]
:)
вопрос с Bitblt уже решён, к счастью [2].
Но возникло ещё несколько (
помимо [2] не понятно почему не работает функции SendInput, mouse_event и keybd_event в логон скрине...
Эх. ну и намудрили с сервисами...
← →
Tarantiono (2006-01-29 01:15) [5]Вопрос с SendInput тоже решил - не внимательность... забыл применить SetThreadDesktop к потоку, который вызывает SendInput.
Но как определить, что на экране сейчас Logon Screen не знаю...
(прошу прощения за небольшой флуд)
← →
Deka © (2006-01-30 10:22) [6]Может есть набор сервисов которые активны/пассивны в разных режимах? Либо создаются/удаляются какие-нибудь специфические объекты...
← →
Набережных С. © (2006-01-30 11:02) [7]
> Tarantiono (29.01.06 01:15) [5]
> Но как определить, что на экране сейчас Logon Screen не
> знаю...
Может быть, по отсутствию интерактивного пользователя? Посмотри Winlogon notification package и функции из группы WtsXXX. Также можно попробовать по имени интерактивного десктопа - при Logon Screen его зовут "Logon" или "Winlogon", кажется, если правильно помню, сам проверь. Есть еще у него какие-то особенности в DACL, но какие - не помню:(
Ну и самое простое - десктоп твоего интерактивного сервисного потока не совпадает с возвращенным функцией OpenInputDesktop.
← →
Tarantiono (2006-01-30 14:49) [8]
> Deka © (30.01.06 10:22) [6]
Меня больше интересует общий случай, т.е. не известно какие сервисы запущены.
> Набережных С. © (30.01.06 11:02) [7]
> Посмотри Winlogon notification package и функции из группы
> WtsXXX.
Смотрел я пример такой библиотеки... но определить отсутствие интерактивного пользователя с её помощью нельзя, возможность работы нескольким пользователям в XP сильно мешает в данном случае.
А вот WTS подробно изучить надо будет.
> Также можно попробовать по имени интерактивного десктопа
> - при Logon Screen его зовут "Logon" или "Winlogon", кажется,
> если правильно помню, сам проверь.
Тоже интересный вариант... только вот лучше вариант с нотификацией, т.к. опять же в моём случае прийдётся слишком часто проверять активен ли логон скрин или нет.
Пока что вышел исположения таким образом - когда функция BitBlt возвращает false при попытке обратиться к DC рабочего стола - делаю
OpenInputDesktop
SetThreadDesktop
всё отлично работает и без лишних оверхедов, но проблема есть в XP.
Допустим есть 2 пользователя.
Включаем компьютер, появляется логон экран, выбираем 1 пользователя - заходим - корректно определяется и устанавливается другой рабочий стол - всё работает.
Делаем логофф. В логон скрине выбираем второго пользователя - всё нормально работает.
А вот если залогинится под двумя пользователями сразу (Switch user) то указаный мной способ даёт сбой, т.е. на каком то этапе не удаётся установить десктоп вызывающему потоку...
надеюсь не очень путанно объяснил.
← →
kaZaNoVa © (2006-01-30 14:52) [9]
> на каком то этапе не удаётся установить десктоп
> вызывающему потоку...
а на каком именно?))
← →
Tarantiono (2006-01-30 14:55) [10]
> kaZaNoVa © (30.01.06 14:52) [9]
А кто его знает! Функция SetThreadDesktop выполняется успешно, даже сообщения от мыши/клавиатуры передаются и выполняются (SendInput), а BitBlt возвращает белый прямоугольник... чудеса.
есть подозрения что проблемы с hdc, но я пробовал пересоздавать hdc кажыдый раз после вызова SetThreadDesktop - безрезультатно.
← →
Набережных С. © (2006-01-30 16:05) [11]
> Tarantiono (30.01.06 14:49) [8]
> А вот если залогинится под двумя пользователями сразу (Switch
> user)
Вероятно, это связано с тем, что твой интерактивный сервис работает в терминальной сессии первого из залогинившихся пользователей?
Вообще интересная ситуация, я ее как-то оставил без внимания. Видимо из-за отрицательного отношения к интерактивным сервисам:) В твоем случае, кстати, тоже наверняка можно без него обойтись. Да и придется, скорее всего, из-за проблем с Fast Switching:))
← →
Набережных С. © (2006-01-30 16:21) [12]
> Смотрел я пример такой библиотеки... но определить отсутствие
> интерактивного пользователя с её помощью нельзя, возможность
> работы нескольким пользователям в XP сильно мешает в данном
> случае.
> А вот WTS подробно изучить надо будет.
Боюсь, что одним каким-то способом не обойтись, придется комбинировать. По крайней мере, в W2k без "Winlogon notification package" не обойтись. Заодно глянь старый NT-шный способ с SetconsoleCtrlHandler, но это уж совсем устаревшее, вряд ли пригодится.
← →
Tarantiono (2006-01-30 16:44) [13]
> Набережных С. © (30.01.06 16:05) [11]
> В твоем случае, кстати, тоже наверняка можно без него обойтись.
Никак нельзя... т.к. мало того что необходим доступ к DC рабочего стола, но и этот DC нужен ещё когда не одного пользовательского рабочего стола нету, т.е. при появлении Логон экрана.
Прийдётся оставить "as is" скорее всего... т.к. у "конкурентского" ПО данная проблема тоже не решена )
> SetconsoleCtrlHandler
лучше уж Winlogon notification package )
← →
Набережных С. © (2006-01-30 17:35) [14]
> Tarantiono (30.01.06 16:44) [13]
Ничто не мешает сервису подключать к интерактивному столу один из своих потоков, причем работающих под аккаунтом данного пользователя, причем по мере необходимости. Тем более, что проблемы с User Switching, заставят, скорее всего, отказаться от интерактивности. Впрочем, тебе видней:)
← →
Набережных С. © (2006-01-30 17:41) [15]Кстати, если найдешь способ подключить уже запущенный в какой-то терминальной сессии процесс к чужой терминальной сессиии, поделись, пожалуйста:)
← →
Tarantiono (2006-01-30 20:06) [16]
> Ничто не мешает сервису подключать к интерактивному столу
> один из своих потоков
Но для этого сервису надо быть интерактивным, ведь так?
> Набережных С. © (30.01.06 17:41) [15]
OpenWindowStation, SetProcessWindowStation, OpenDesktop и SetThreadDesktop? )
только каким образом это поможет в моём вопросе...
← →
Набережных С. © (2006-01-30 22:00) [17]
> > Ничто не мешает сервису подключать к интерактивному столу
>
> > один из своих потоков
>
> Но для этого сервису надо быть интерактивным, ведь так?
Совсем не обязательно. Интерактивным станет тольео подключенный поток и только еа время пока подключен, и ты сам этим управляешь. А работать такой поток может от имени текущего пользователя, что очень полезно для безопасности системы:) А функции для этого ты сам же ниже и привел:))
> > Набережных С. © (30.01.06 17:41) [15]
>
> OpenWindowStation, SetProcessWindowStation, OpenDesktop
> и SetThreadDesktop? )
> только каким образом это поможет в моём вопросе...
Боюсь, что не поможет. Я ведь говорил о переключении между терминальными сессиями, а приведенные функции действуют только внутри сессии, за ее пределы с их помощью не выйдешь.
← →
Tarantiono (2006-01-31 15:15) [18]
> Набережных С. ©
Многое для себя прояснил пока разбирался.... надо Руссановича покупать )
Спасибо за помощь.
← →
Tarantiono (2006-03-09 00:28) [19]
> Набережных С. © (30.01.06 17:41) [15]
>
> Кстати, если найдешь способ подключить уже запущенный в
> какой-то терминальной сессии процесс к чужой терминальной
> сессиии, поделись, пожалуйста:)
SetProcessWindowStation? :-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c