CreateProcessWithLogonW() Probleme -, Brauchen zum starten von sub-Prozessen mit den gleichen Benutzer
Ich habe ein Windows ausführbare Datei, die gestartet wird, innerhalb eines service durch den Aufruf CreateProcessWithLogonW() mit einer Reihe von angegebenen user-details.
Dieser funktioniert einwandfrei und der Prozess gestartet wird, wie erwartet. Jedoch, wenn dieser Prozess versucht, zu starten andere Prozesse selbst, die derzeit nur mit CreateProcess (), diese beginnen dann sterben sofort - Sie sind ausführbare Dateien, die erfordern den desktop-Zugriff.
Nach dem Lesen auf Microsoft ' s Artikel über CreateProcess() - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
Denke ich kann sehen, warum dies geschieht, und es macht Sinn, zu einem gewissen Grad. CreateProcess() weiß der aufrufende Prozess wird die Identität eines Benutzers so, es nutzt seine übergeordnete Prozess, der in diesem Fall ist das Lokale System-Konto. Aber natürlich ist alles, was Sie ausführen in das lokale system-Konto keinen Zugang haben, die wir brauchen, so startete der Prozess stirbt.
Seltsam, wenn ich zuvor mit LogonUser() und CreateProcessAsUser() zu starten, die erste ausführbare Datei im service, es hat gut funktioniert. Aber ich hatte dies zu ändern, um die CreateProcessWithLogonW () - aufgrund von Problemen mit nicht mit die richtigen Berechtigungen.
Weiß jemand eine Lösung für dieses? Ich habe gesehen, sprechen die an anderer Stelle auf dem web, aber nicht mit einer endgültigen Lösung. Es scheint, dass ich möglicherweise müssen Sie den token des Benutzers, ich bin die Anmeldung mit in CreateProcessWithLogonW() mit, so kann ich es verwenden, um das starten der anderen Prozesse später? Aber ich habe keine Möglichkeit, halten Sie dieses token, kann das sein retreived für den aktuellen Benutzer in irgendeiner Weise?
Jede Hilfe wäre sehr geschätzt, danke 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besitzen Sie den code gestartet mit
CreateProcessWithLogonW
(und die wiederum ruftCreateProcess
)? Wenn Sie dies nicht tun, dann müssen Sie möglicherweise führen Sie IAT (oder API -) hook auf es (D. H. zur Laufzeit), als Ersatz irgendwelche Anrufe zuCreateProcess
mit einem entsprechenden Verfahren, die auch verwendetCreateProcessWithLogonW
oderCreateProcessWithTokenW
. Sehen APIHijack, Umwege.Nachdem dies geschehen ist, wird der Kind-Prozess kann verlangen, Zugriff auf
HKCU
. Wenn Sie nicht bereits sind, dies zu tun, sollten Sie laden das Profil der einzelnen imitierten Benutzers, pro user einmal, bevor SieCreateProcessWithLogonW
.Lösten wir das problem mit einigen code, den ich gefunden vor langer Zeit. Das "copyright" Abschnitt, der einer der source-Module enthält die folgenden:
Vielleicht diese Informationen wird der Ertrag hat in Ihrer Google-Suche - ich versuchte ein paar schnelle versucht, aber kam mit leeren Händen.
Wir zerlegten die Interna in einen Satz von API, ergab die Ergebnisse, die wir brauchten.
Gibt es nicht eine option für Dienste, um Ihnen zu erlauben, mit dem desktop interagieren? Wenn Einstellung, die option für Ihren Dienst ist eine Möglichkeit, das wäre wahrscheinlich die einfachste Lösung.
Gehe ich davon aus, dass dieser Prozess ein Dienst ist, der nicht in der angegebenen Frage, aber scheint logisch, gegeben, dass Sie als Lokales System ausgeführt wird Konto.
Wo sind Sie stecken, nicht in
CreateProcess
Es in"CreateService"
. Wenn Sie möchten, dass Ihr Dienst in der Lage, mit dem desktop interagieren, müssen Sie angeben,SERVICE_INTERACTIVE_PROCESS
als eine der Fahnen, um das argumentdwServiceType
. Diese Einstellung vererbt sich an Kind-Prozesse des service.Können Sie auch einen bestehenden service ändern Sie die Einstellung mithilfe des Tools Dienste, wählen Sie die Eigenschaften für den Dienst, klicken Sie auf die Registerkarte "Anmelden" und aktivieren Sie das Kontrollkästchen "Allow service to interact with desktop".