2017-10-27 4 views
1

Ich habe erfolgreich SendSAS in einem Dienst (Local System Account) verwendet. Ich rufe die API vier Sekunden nach dem Start des Dienstes an. Es scheint, dass Windows, egal wie lange der Bootprozess dauert, den Call cache (sortieren): der gleiche Code zeigt mir schließlich ein Anmeldefenster einige Sekunden nach dem Einschalten, auf einem schnellen Laptop (Win10), und zeigt mir auch die Anmeldebildschirm nach einer sehr viel längeren Verzögerung auf einem langsamen Server (2012R2), der virtualisiert läuft (WMware).Wie kann man wissen, wann der Winlogon-Desktop für Eingaben bereit ist?

Ich bin auch in der Lage, CreateProcessAsUser (mit einem aktualisierten Token) zu verwenden, um eine kleine ausführbare Datei in der Sitzung 1, Station WinSta0, Desktop Winlogon zu injizieren. Der Prozess verwendet dann SendInput zur "automatischen Anmeldung" der Sitzung (ja, das ist ein schrecklicher Gedanke zu tun, ich bin mir dessen bewusst).

Mein Problem: Wenn der winzige Prozess "zu früh" beginnt, passiert nichts. Wenn der Dienst beispielsweise 2 Minuten wartet, ist alles in Ordnung.

Welche API sollte ich (im Dienst oder im gestarteten Prozess) verwenden, um herauszufinden, wann der WinLogon-Desktop bereit ist, Tastatureingaben zu akzeptieren?

Ich versuchte WTSGetActiveConsoleSessionId (im Dienst) und OpenInputDesktop (im Prozess) hopping dieser Fehler würde bedeuten, die Notwendigkeit zu warten, aber ohne Erfolg.

+0

* wenn der winzige Prozess "zu früh" beginnt, passiert nichts * - sind aber Prozess gestartet ok? wenn ja, kann warten (wenn nötig) innerhalb dieses Prozesses, aber nicht im Dienst? – RbMm

+0

CreateProcessAsUser ist immer erfolgreich. Ich bin in Ordnung mit einer Wartezeit, aber wie lange? Warten auf was? – manuell

+0

Windows verfügt über eigene integrierte Funktionen zur automatischen Anmeldung. Warum machen Sie das überhaupt im Code? –

Antwort

1

Wenn Ihr Prozess in Sitzung 1 startet, die an den Desktop WinSta0\Winlogon angeschlossen ist, können Sie regelmäßig das Control Type des derzeit fokussierten Elements IUIAutomationElement testen. Die zu verwendenden APIs sind: IUIAutomation::GetFocusedElement und dann IUIAutomationElement::GetCurrentPropertyValue für die UIA_ControlTypePropertyId-Eigenschaft. Wenn Sie ein fokussiertes Element des Typs UIA_EditControlTypeId erfolgreich abrufen, ist der Windows-Anmeldebildschirm bereit, Eingaben zu akzeptieren.

Vergessen Sie nicht, zwischen jedem Versuch einen Anruf Sleep hinzuzufügen.

getestet OK mit Windows Server 2008R2 und 2012R2 und Windows 10.

Verwandte Themen