2012-05-27 2 views
3

Я хотел бы запустить приложение на экране входа в Windows 7 из службы.Запустить приложение на экран входа в систему Win7

Я делал длительные исследования по этому вопросу и тестировал разные способы, но, к сожалению, пока не был полностью успешным. Мне удалось запустить приложение на экране блокировки текущего пользователя, который сначала посмотрел на меня так, как я пытался добиться. Тем не менее, я тогда понял, что существуют разные экраны входа для каждого пользователя и общие (независимые от пользователя).

Я полагаю, что этот пользовательский независимый экран входа в систему (который появляется непосредственно после загрузки при наличии нескольких учетных записей или при нажатии «переключить пользователя» на экране блокировки) запускается в сеансе 0, тогда как пользователь 1 запускается в сеансе 1, пользователя 2 в сеансе 2 и т. д. Проблема в том, что если я запустил приложение в сеансе 0 (с «winsta0 \ winlogon»), он не будет виден; работа в сеансе 1 работает нормально, но не очень помогает, поскольку пользователь должен быть уже зарегистрирован для этого.

Как запустить приложение на пользовательском экране входа в систему/приветствия? Каковы правильные параметры и функции для этой цели? У кого-нибудь есть рабочий пример для демонстрации? (Delphi предпочтителен, но на самом деле любой другой язык тоже будет работать!)

+0

Вы пытаетесь использовать [Поставщики учетных данных] (http://msdn.microsoft.com/en-us/magazine/cc163489.aspx) и [ICredentialProviderCredential] (http://msdn.microsoft.com/en- us/library/windows/desktop/bb776029% 28v = vs.85% 29.aspx) и [ICredentialProvider] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb776042%28v=vs .85% 29.aspx)? – RRUZ

ответ

1

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

Если вы не против нарушать правила, служба, работающая как локальная система, должна иметь возможность запускать подпроцесс в выбранном вами сеансе. Используйте OpenProcessToken, чтобы получить дескриптор вашего токена безопасности, дублируйте его с помощью DuplicateTokenEx, используйте SetTokenInformation, чтобы изменить идентификатор сеанса токена, затем вызовите CreateProcessAsUser для запуска подпроцесса. (Первоначально было бы проще использовать отдельный исполняемый файл, но как только вы очистите ошибки, вы можете свернуть службу и подпроцесс в один исполняемый файл, например, используя аргумент командной строки или переменную среды, чтобы отличить два случая.)

Функция WTSGetActiveConsoleSessionId сообщит вам, какая сессия в данный момент подключена к физической консоли.

+0

Проблема заключается в том, что WTSGetActiveConsoleSessionId работает только с включенным пользователем. Я просто не могу получить доступ к экрану «switch user», поскольку этот не принадлежит никому. Я могу разместить что-то на экране «блокировки», но не на экране «переключатель пользователя». Также: Что вы подразумеваете под словом правил? – CodeX

+0

Я верю в недавно перезагруженную систему, экран входа в систему будет запущен в сеансе 1. Во всяком случае, вы можете проверить: запустить список задач удаленно против вашей целевой системы и посмотреть сеанс, содержащий процесс winlogon. Таким образом, вы можете попробовать запустить процесс на этом сеансе в качестве доказательства концепции. После того, как вы отсортированы, вы можете беспокоиться о том, как определить, какой сеанс использовать в общем случае. Конечно, процесс должен подключиться к правильному рабочему столу и/или оконной станции; это должно быть очень похоже на то, что вы уже сделали, чтобы отображать содержимое на рабочем столе блокировки. –

+0

Под «нарушением правил» я имею в виду именно это. Вы не должны отображать контент на экране входа в систему, за исключением внедрения поставщика учетных данных. Это почти наверняка можно сделать, но нет гарантии, что тот же код будет продолжать работать в будущих версиях ОС. Даже установка будущего исправления может заставить его перестать работать, хотя это менее вероятно. –

Смежные вопросы