Как узнать, когда рабочий стол Winlogon готов к вводу?

Я успешно использовал SendSAS в службе (учетная запись локальной системы). Я вызываю API через четыре секунды после запуска сервиса. Кажется, что независимо от продолжительности процесса загрузки, Windows удается кэшировать (вроде) вызов: тот же код, наконец, показывает мне экран входа в систему через несколько секунд после включения на быстром ноутбуке (Win10), а также показывает мне Экран входа в систему после очень большой задержки на медленном сервере (2012R2), работающем виртуализированно (wmware).

Я также могу использовать CreateProcessAsUser (с обновленным токеном) для добавления крошечного исполняемого файла в Сессию 1, Station WinSta0, Desktop Winlogon. Затем процесс использует SendInput для «автоматического входа» в сеанс (да, это ужасная мысль, чтобы сделать, я знаю об этом).

Моя проблема: если крошечный процесс начинается «слишком рано», ничего не происходит. Если служба ждет, скажем, 2 минуты, все в порядке.

Какой API я должен использовать (в сервисе или в запущенном процессе), чтобы узнать, когда рабочий стол WinLogon готов принимать ввод с клавиатуры?

Я старался WTSGetActiveConsoleSessionId (в сервисе) и OpenInputDesktop (в процессе) прыжок, который отказал бы, указывал бы на необходимость ждать, но безрезультатно.

1

Решение

Когда ваш процесс начинается в сеансе 1, прикреплен к WinSta0\Winlogon рабочий стол, вы можете периодически проверять Control Type в настоящее время IUIAutomationElement сфокусированный элемент.

Используемые API: IUIAutomation :: GetFocusedElement а потом IUIAutomationElement :: GetCurrentPropertyValue для UIA_ControlTypePropertyId имущество. Когда вы успешно получаете сфокусированный элемент типа UIA_EditControlTypeId, экран входа в Windows готов принять входные данные.

Не забудьте добавить Sleep звоните между каждой попыткой.

Протестировано нормально с Windows Server 2008R2 и 2012R2, а также с Windows 10.

2

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

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

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