Я успешно использовал SendSAS в службе (учетная запись локальной системы). Я вызываю API через четыре секунды после запуска сервиса. Кажется, что независимо от продолжительности процесса загрузки, Windows удается кэшировать (вроде) вызов: тот же код, наконец, показывает мне экран входа в систему через несколько секунд после включения на быстром ноутбуке (Win10), а также показывает мне Экран входа в систему после очень большой задержки на медленном сервере (2012R2), работающем виртуализированно (wmware).
Я также могу использовать CreateProcessAsUser (с обновленным токеном) для добавления крошечного исполняемого файла в Сессию 1, Station WinSta0, Desktop Winlogon. Затем процесс использует SendInput для «автоматического входа» в сеанс (да, это ужасная мысль, чтобы сделать, я знаю об этом).
Моя проблема: если крошечный процесс начинается «слишком рано», ничего не происходит. Если служба ждет, скажем, 2 минуты, все в порядке.
Какой API я должен использовать (в сервисе или в запущенном процессе), чтобы узнать, когда рабочий стол WinLogon готов принимать ввод с клавиатуры?
Я старался WTSGetActiveConsoleSessionId (в сервисе) и OpenInputDesktop (в процессе) прыжок, который отказал бы, указывал бы на необходимость ждать, но безрезультатно.
Когда ваш процесс начинается в сеансе 1, прикреплен к WinSta0\Winlogon
рабочий стол, вы можете периодически проверять Control Type
в настоящее время IUIAutomationElement
сфокусированный элемент.
Используемые API: IUIAutomation :: GetFocusedElement а потом IUIAutomationElement :: GetCurrentPropertyValue для UIA_ControlTypePropertyId
имущество. Когда вы успешно получаете сфокусированный элемент типа UIA_EditControlTypeId
, экран входа в Windows готов принять входные данные.
Не забудьте добавить Sleep
звоните между каждой попыткой.
Протестировано нормально с Windows Server 2008R2 и 2012R2, а также с Windows 10.
Других решений пока нет …