2010-06-03 8 views
5

Ich habe alle Beiträge auf Stack Overflow über CreateProcessAsUser gelesen und es gibt sehr wenige gelöste Fragen, also halte ich nicht den Atem an diesem. Aber es scheint, als würde ich definitiv etwas vermissen, also könnte es einfach sein.LogonUser -> CreateProcessAsUser von einem Systemdienst

Das Ziel-Betriebssystem ist Windows XP. Ich habe einen Dienst, der als "Lokales System" ausgeführt wird, von dem ich einen Prozess erstellen möchte, der als ein anderer Benutzer ausgeführt wird. Für diesen Benutzer habe ich den Benutzernamen und das Kennwort, damit LogonUser funktioniert und ich ein Token für den Benutzer (in diesem Fall ein Administratorkonto) erhalte. Ich versuche dann, dieses Token zum Aufrufen von CreateProcessAsUser zu verwenden, aber es schlägt fehl, weil dieses Token kommt nicht mit SeAssignPrimaryTokenPrivilege - es hat jedoch SeIncreaseQuotaPrivilege. (Ich habe GetTokenInformation verwendet, um alle mit diesem Token verknüpften Berechtigungen zu sichern.) Gemäß der MSDN-Seite für CreateProcessAsUser benötigen Sie beide Berechtigungen, um CreateProcessAsUser erfolgreich aufrufen zu können.

Er sagt auch, Sie nicht den SeAssignPrimaryTokenPrivilege benötigen, wenn das Token Sie sich in CreateProcessAsUser() übergeben eine „eingeschränkte Version des anrufenden Prozesses primäre Token“ ist, was ich mit CreateRestrictedToken schaffen kann(), aber es dann wird mit dem Benutzer des lokalen Systems verknüpft und nicht mit dem Zielbenutzer, mit dem ich den Prozess ausführen möchte.

Wie würde ich also ein Anmeldetoken erstellen, das eine eingeschränkte Version des primären Tokens des aufrufenden Prozesses ist UND mit einem anderen Benutzer verknüpft ist? Vielen Dank!

Beachten Sie, dass es hier keine Notwendigkeit für Benutzer-Interaktion ist - es ist alles unbeaufsichtigt - so gibt es keine Notwendigkeit, solche Sachen packen WinSta0, etc. zu tun

+1

Was schlägt GetLastError nach CreateProcessAsUser fehl? – Anders

+0

Haben Sie es gelöst? Ich brauche auch eine Lösung :) – AgentFire

+0

Die Google Chrome-Jungs lösten dieses Problem auch mit einer undokumentierten Start-Server-API, die den ganzen Weg zurück zu XP existiert. Wenn Sie ein Token für den Benutzer erhalten können, den Sie erstellen möchten Der Prozess als, Sie können diesen Code hier folgen: http://src.chromium.org/chrome/trunk/src/remoting/host/win/launch_process_with_token.cc –

Antwort

4

SE_ASSIGNPRIMARYTOKEN_NAME ist ein Privileg, mit dem Sie in Ihrem Prozess/Thread aktivieren Open/Open + LookupPrivilegeValue + AdjustTokenPrivileges (Es ist leicht, diese mit TOKEN_ASSIGN_PRIMARY zu verwirren, und MSDN sagt, Sie brauchen beide ein primäres Token an einen Prozess anhängen)

auf dieser XP: SP2-Maschine, nur Logonuser aufrufen (... , LOGON32_LOGON_INTERACTIVE, ...) + CreateProcessAsUser funktioniert einwandfrei, ohne mit irgendwelchen Privilegien herumzuhantieren (Mit einem falschen cmd.exe-Dienst, aber das sollte nicht ma tter)

Dieses Zitat auf MSDN:

Wenn die erforderlichen Privilegien nicht bereits aktiviert ist, CreateProcessAsUser ermöglicht es ihnen, für die Dauer des Anruf

und die Tatsache, dass Sie läuft als SYSTEM und sollte in der Lage sein, jedes Privileg zu aktivieren, führt mich zu der Annahme, dass das Zuweisen von Primärzeug nicht das Problem ist.

+0

Sie haben Recht, es stellte sich heraus, dass es ein Hering ist . Dies ist nützliches Wissen für später. Vielen Dank. –

Verwandte Themen