Frage

Ich habe eine ausführbare Windows-Datei, die aus einem durch einen Anruf CreateProcessWithLogonW () mit einem Satz von specfied Benutzerdaten gestartet wird.

Das funktioniert gut, und der Prozess beginnt wie erwartet. Wenn jedoch dieser Prozess versucht, andere Prozesse selbst zu starten, die derzeit nur mit Createprocess () diese beginnen dann sterben sofort -. Sie sind ausführbare Dateien, die Desktop-Zugriff erfordert

Nach dem Lesen auf Microsoft Artikeln über Createprocess () - http://msdn.microsoft.com/en-us/library/ms682425 (VS.85) aspx

Ich denke, kann sehen, warum dies geschieht und es macht Sinn, in einem Ausmaß. Createprocess () kennt der aufrufende Prozess einen Benutzer imitiert, so dass es es ist Prozess Mutter verwendet, die in diesem Fall das Konto Lokales System ist. Aber natürlich alles in dem lokalen Systemkonto laufen nicht den Zugang hat, die wir brauchen, um die gestartete Prozess stirbt.

Merkwürdig, wenn ich zuvor mit Logonuser () und CreateProcessAsUser (), um die anfänglichen ausführbaren im Dienst zu starten, es funktionierte gut. Aber ich musste das CreateProcessWithLogonW ändern () aufgrund von Problemen mit nicht den richtigen Berechtigungen haben.

Weiß jemand, der eine Lösung für dieses? Ich habe über diese an anderer Stelle im Netz gesehen Rede aber nicht mit einer bestimmten Lösung. Es scheint, wie ich möglicherweise das Token des Benutzers müssen mit i bin Anmeldung in CreateProcessWithLogonW () mit, damit ich sie verwenden kann später die anderen Prozesse zu starten? Aber ich habe keine Möglichkeit, halten dieses Token zu bekommen, kann dies für den aktuellen Benutzer in irgendeiner Weise retreived werden?

Jede Hilfe wäre sehr dankbar, danke:)

War es hilfreich?

Lösung

Besitzen Sie den Code mit CreateProcessWithLogonW gestartet (und die wiederum ruft CreateProcess)? Wenn Sie nicht dann müssen Sie IAT auszuführen (oder API) Einhaken auf sie (dh zur Laufzeit), wie Anrufe zu ersetzen mit einem geeigneten Verfahren CreateProcess, die auch CreateProcessWithLogonW oder CreateProcessWithTokenW verwendet. Siehe APIHijack , Detours .

Nachdem dies geschehen ist, kann das Kind Prozess Zugriff auf HKCU erfordern. Wenn Sie nicht bereits tun dies, sollten Sie das Profil jedes imitierten Benutzer geladen werden, einmal pro Benutzer, bevor CreateProcessWithLogonW aufrufen.

  

In der Standardeinstellung CreateProcessWithLogonW   nicht den angegebenen Benutzer laden   Profil in den HKEY_USERS Registrierungs   Schlüssel. Dies bedeutet, dass der Zugang zu   Informationen in der HKEY_CURRENT_USER   Registrierungsschlüssel wird möglicherweise nicht produzieren Ergebnisse   , die im Einklang mit einem normalen   interaktive Anmeldung. Es ist dein   Verantwortung der Benutzer zu laden   Registrierungsstruktur in HKEY_USERS vor   Aufruf CreateProcessWithLogonW, durch   Verwendung LOGON_WITH_PROFILE oder durch   Aufruf der Funktion Loaduserprofile.

Andere Tipps

Wir lösten das Problem einige Code, den ich vor langer Zeit gefunden. Der „Copyright“ Abschnitt eines des Quellenmodule enthält folgende Komponenten:

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

Vielleicht werden diese Informationen Treffer in Ihren Google-Suchanfragen ergeben - ich schnell ein paar Versuche, versucht aber kam mit leeren Händen. Wir zerlegt die Interna in eine Reihe von API, die die Ergebnisse lieferten wir brauchten.

Gibt es nicht eine Option für die Dienste, damit sie mit dem Desktop zu interagieren? Wenn Einstellung, die Option für Ihren Dienst eine Möglichkeit ist, das wäre wohl die einfachste Lösung sein.

Ich gehe davon aus, dass dieser Prozess ein Dienst ist; das ist nicht in der Frage angegeben, scheint aber logisch gegeben, dass sie als lokales Systemkonto ausgeführt wird.

Wo Sie stecken immer noch nicht in CreateProcess, es ist in CreateService . Wenn Sie Ihren Dienst wollen mit dem Desktop interagieren zu können, müssen Sie angeben, SERVICE_INTERACTIVE_PROCESS als eine der Fahnen auf das Argument dwServiceType. Diese Einstellung wird von Kindprozesse des Dienstes vererbt wird.

Sie können auch einen bestehenden Service der Einstellung ändern, indem Sie das Tool Dienst, wählen Sie Eigenschaften für den Dienst verwenden, klicken Sie auf „Anmelden“ Registerkarte und wählen Sie das Kontrollkästchen „Allow Service mit Desktop interagieren“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top