Я пишу сервисное приложение, которое будет работать с local system
полномочия. Мне нужно будет узнать из своего сервиса, отображается ли экран входа в Windows в какое-либо конкретное время. Есть какой-либо способ сделать это?
PS. Экраны, которые можно вызвать, заблокировав рабочую станцию:
Или, пытаясь переключить пользователя:
Или после Ctrl + Alt + Del:
PS. Мне нужно это для запуска на Windows XP и выше.
РЕДАКТИРОВАТЬ: Единственное жизнеспособное решение, которое я придумала, это посмотреть, LogonUI.exe
процесс запущен. Проблема с этим подходом состоит в том, как отличить реальный процесс входа в систему от любого другого процесса с таким именем образа?
Как описано в комментариях, вы пытаетесь определить, должен ли процесс в сеансе интерактивного рабочего стола показывать окно сообщения. Нет смысла делать это, если интерактивный сеанс не активен.
В таком случае я считаю, что предложенное вами решение неверно. Вместо этого вы должны зарегистрироваться для получения уведомлений об изменении сеанса, позвонив WTSRegisterSessionNotification
, Когда вы сделаете это, вы получите WM_WTSSESSION_CHANGE
сообщения, которые позволяют отслеживать текущее состояние.
Обратите внимание, что вы делаете это в своем настольном приложении, а не в сервисе. Служба по-прежнему отправляет свои сообщения в настольное приложение. Но настольное приложение теперь знает, стоит ли их показывать.
Обновить
Реми предлагает лучший способ в комментариях:
И если используется отдельное приложение, нет никакой причины обнаруживать изменения сеанса вообще, это приложение может просто проверить, является ли его назначенная в настоящее время рабочая станция / рабочий стол интерактивной рабочей станцией / рабочим столом в настоящий момент, сравнивая
GetThreadDesktop()
вOpenInputDesktop()
, например.
Все такие экраны представлены на отдельном рабочем столе. Вы можете попытаться перечислять рабочие столы пользователя и сравните его с текущим (я не уверен, что служба в сеансе 0 — Vista и выше — может это сделать; если нет, порождает вспомогательный процесс в сеансе пользователя). Однако это может дать ложное срабатывание, если рабочий стол UAC включен. Другой угловой случай — это ситуация без пользователя (сразу после загрузки, прежде чем какой-либо пользователь включится).
В окнах несколько состояний.
Когда Winlogon находится в состоянии выхода из системы, пользователям предлагается идентифицировать себя и предоставить информацию для аутентификации. Если пользователь предоставляет правильную информацию об учетной записи пользователя и никакие ограничения не препятствуют этому, пользователь входит в систему и на рабочем столе приложения запускается программа оболочки (например, Windows Explorer). Winlogon переходит в состояние входа в систему.
Когда Winlogon находится в состоянии входа в систему, пользователи могут взаимодействовать с оболочкой, активировать дополнительные приложения и выполнять свою работу. Из состояния входа в систему пользователи могут либо прекратить всю работу и выйти из системы, либо заблокировать свои рабочие станции (оставив всю работу на месте). Если пользователь решит выйти из системы, Winlogon завершит все процессы, связанные с этим сеансом входа в систему, и рабочая станция будет доступна для другого пользователя. Если вместо этого пользователь решает заблокировать рабочую станцию, Winlogon переходит в состояние блокировки рабочей станции.
Когда Winlogon находится в состоянии блокировки рабочей станции, защищенный рабочий стол отображается до тех пор, пока пользователь не разблокирует рабочую станцию, предоставив ту же информацию идентификации и аутентификации, что и у пользователя, который первоначально вошел в систему, или пока администратор не выполнит принудительный выход из системы. Если рабочая станция разблокирована, отображается рабочий стол приложения, и работа может быть возобновлена.
ссылка: https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa380547(v=vs.85).aspx
постскриптум регистрация защищенной последовательности внимания (SAS, CTRL + ALT + Delete) включена в состояние блокировки рабочей станции
Точно так же в Windows есть несколько типов рабочего стола.
Рабочий стол Winlogon
Рабочий стол приложения (= Рабочий стол по умолчанию)
Заставка рабочего стола
Безопасный рабочий стол
Я рекомендую вам прочитать это:
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa375994(v=vs.85).aspx
Я не знаю, мои ответы — то, что вы хотите … но я надеюсь, что это поможет в некотором смысле.