如何知道Winlogon桌面何时可以输入?

时间:2017-10-27 15:00:56

标签: c++ windows winapi service winlogon

我在服务(本地系统帐户)中成功使用了SendSAS。我在服务启动后四秒钟调用API。似乎无论启动过程持续时间如何,Windows都会设置缓存(排序)调用:相同的代码最终会在开机几秒后在快速笔记本电脑(Win10)上显示登录屏幕,并且还向我显示在运行虚拟化(wmware)的慢速服务器(2012R2)上延迟了很长时间后登录屏幕。

我还可以使用CreateProcessAsUser(使用更新的令牌)在Session 1,Station WinSta0,Desktop Winlogon中注入一个小的可执行文件。然后,该流程使用SendInput来自动登录"会议(是的,这是一个可怕的想法,我知道这一点)。

我的问题:如果微小的过程开始过早,那么就没有任何反应。如果服务等待,比如2分钟,一切都没问题。

我应该使用什么API(在服务中或在启动过程中)找出WinLogon桌面何时可以接受键盘输入?

我尝试WTSGetActiveConsoleSessionId(在服务中)和OpenInputDesktop(在此过程中)跳转失败将表明需要等待,但无济于事。

1 个答案:

答案 0 :(得分:2)

当您的流程在会话1中启动并附加到exmple.com/dp/id/om-Joan 桌面时,您可以定期测试当前WinSta0\Winlogon焦点元素的Control Type

要使用的API为:IUIAutomation::GetFocusedElement ,然后是IUIAutomationElement属性的IUIAutomationElement::GetCurrentPropertyValue。当您成功获得类型为UIA_ControlTypePropertyId的焦点元素时,Windows登录屏幕已准备好接受输入。

不要忘记在每次尝试之间添加UIA_EditControlTypeId来电。

使用Windows Server 2008R2和2012R2以及Windows 10进行了测试。