2008-08-28 15 views
3

Ich brauche ShellExecute etwas wie ein anderer Benutzer, derzeit beginne ich einen Helfer-Prozess mit CreateProcessAsUser, die ShellExecute ruft, aber das scheint zu viel von einem Hack (Falscher Elternprozess usw.) Gibt es einen besseren Weg zu tun Dies?CreateProcessAsUser vs ShellExecute

@PabloG: ImpersonateLoggedOnUser funktioniert nicht:

 
HANDLE hTok; 
VERIFY(LogonUser("otheruser",0,"password",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hTok)); 
VERIFY(ImpersonateLoggedOnUser(hTok)); 
ShellExecute(0,0,"calc.exe",0,0,SW_SHOW); 
RevertToSelf(); 
CloseHandle(hTok); 

startet nur calc wie der angemeldete Benutzer, nicht "otheruser"

@ 1800 WEITERE INFORMATIONEN: CreateProcess/CreateProcessAsUser ist nicht das gleiche wie ShellExecute , mit UAC unter Vista, CreateProcess ist nutzlos, wenn Sie nicht kontrollieren, welches Programm der Benutzer ausführt (CreateProcess wird mit einem Fehler zurückgegeben, wenn Sie es eine EXE-Datei mit einem Manifest als requireAdmin markiert)

@Brian R. Bondy: Ich kenne diese Informationen bereits (Und versteh mich nicht falsch, es ist gute Sachen), aber es ist off Thema (IMHO) Ich frage nach ShellExecuteAsUser, nicht über Prozesse als ein anderer Benutzer zu starten Ich weiß schon, wie das geht.

Antwort

0

können Sie die ShellExecute wickeln zwischen ImpersonateLoggedOnUser/RevertToSelf

Links: ImpersonateLoggedOnUser: http://msdn.microsoft.com/en-us/library/aa378612(VS.85).aspx RevertToSelf: http://msdn.microsoft.com/en-us/library/aa379317.aspx

sorry, kann nicht Hyperlink URLs mit "()"

+0

Ich bin mir ziemlich sicher, dass ich das versucht habe und es nicht funktioniert, weil der neue Prozess mit dem Token aus dem aktuellen Prozess und nicht seinen Thread – Anders

+0

erzeugt Dies funktioniert, wenn im Haupt-Thread eines Prozesses getan wird, aber es wird funktionieren nicht, wenn sie in einem separaten Thread ausgeführt werden, da ShellExecute den Token-/Sicherheitskontext des Hauptthreads verwendet. Stelle dir das vor. Jetzt ... Wenn Ihre Anwendung mehrere Threads enthält, kann es passieren, dass andere Teile Ihrer Anwendung durch den Impersonate/Revert im Hauptthread beschädigt werden. –

0

Warum gehst du nicht CreateProcessAsUser nur den Prozess angeben, den Sie ausführen möchten?

Sie können möglicherweise auch SHCreateProcessAsUserW verwenden.

+0

Da ich ShellExecute die Handhabung von nicht ausführbaren Dateien benötigen – Anders

+0

SHCreateProcessAsUserW ist nicht unter XP und später implementiert. –

9

Die Lösung hängt wirklich davon ab, was Ihre Bedürfnisse sind, und kann ziemlich komplex sein (Danke voll und ganz an Windows Vista). Dies wird wahrscheinlich außerhalb Ihrer Bedürfnisse sein, aber dies wird anderen helfen, die diese Seite über die Suche finden.

  1. Wenn Sie den Prozess nicht mit einer GUI zu laufen und Sie benötigen keine Höhen
  2. Wenn der Benutzer Sie ausführen wollen, ist bereits in einer Sitzung angemeldet
  3. Wenn Sie das ausführen müssen Prozess mit einer grafischen Benutzeroberfläche und dem Benutzer kann oder nicht in
  4. angemeldet sein, wenn Sie den Prozess mit Höhen

in Bezug auf 1 ausgeführt werden müssen: in win Dows Vista gibt es etwas namens Sitzung 0 Isolation. Alle Dienste werden als Sitzung 0 ausgeführt und Sie sollten keine GUI in Sitzung 0 haben. Der erste angemeldete Benutzer wird in Sitzung 1 angemeldet. In früheren Windows-Versionen (vor Vista) wurde der erste angemeldete Benutzer ebenfalls vollständig ausgeführt Sitzung 0.

Sie können mehrere verschiedene Prozesse mit unterschiedlichen Benutzernamen in derselben Sitzung ausführen. Sie können ein gutes Dokument über Sitzung 0 Isolierung here finden.

Da wir es mit Option 1) zu tun haben, brauchen Sie keine GUI. Daher können Sie Ihren Prozess in Sitzung 0 starten.

Sie erhalten eine Aufrufsequenz so etwas wie dies wollen: Logonuser, ExpandEnvironmentStringsForUser, GetLogonSID, Loaduserprofile, Create, CreateProcessAsUser. Wenn der Benutzer Sie den Prozess ausführen möchte, wie bereits angemeldet ist, können Sie einfach:

Beispielcode für diese kann über eine Suchmaschine oder über Google code search

In Bezug auf 2 zu finden: WTSEnumerateSessions und WTSQuerySessionInformation, um die Sitzungs-ID abzurufen, und anschließend WTSQueryUserToken, um das Benutzer-Token abzurufen. Von dort können Sie einfach das Benutzer-Token in der Win32-API "CreateProcessAsUser" verwenden.

Dies ist eine großartige Methode, da Sie sich nicht einmal als Benutzer anmelden müssen und den Benutzernamen/das Passwort des Benutzers nicht kennen müssen. Ich glaube, das ist nur über einen Dienst möglich, der jedoch als lokales Systemkonto ausgeführt wird.

Sie können die aktuelle Sitzung über WTSGetActiveConsoleSessionId abrufen.

In Bezug auf 3: Sie würden die gleichen Schritte wie # 1, folgen aber zusätzlich würden Sie die lpDesktop Feld STARTUP des verwenden. Setze dies auf winsta0 \ Standard. Sie müssen auch versuchen, die Win32-API von OpenDesktop zu verwenden, und wenn dies fehlschlägt, können Sie CreateDesktop erstellen. Bevor Sie die Station- und Desktop-Handles verwenden, sollten Sie SetSecurityInfo auf jedem von ihnen mit SE_WINDOW_OBJECT und GROUP_SECURITY_INFORMATION | verwenden DACL_SECURITY_INFORMATION.

Wenn der betreffende Benutzer später versucht, sich anzumelden, wird er tatsächlich den laufenden Prozess sehen.

In Bezug auf 4: Dies kann auch getan werden, aber es erfordert, dass Sie bereits einen erhöhten Prozess ausgeführt werden. Ein Dienst, der als lokales Systemkonto ausgeführt wird, wird als erhöht ausgeführt. Ich konnte es auch nur schaffen, indem ich einen authenticode-signierten Prozess hatte, den ich starten wollte. Der Prozess, den Sie auch beginnen möchten, müssen eine Manifest-Datei mit es mit dem requestedExecutionLevel level = „requireAdministrator“

Andere Anmerkungen zugeordnet haben:

  • Sie können ein Token Sitzung über SetTokenInformation gesetzt und TokenSessionId
  • Sie Die Sitzungs-ID eines bereits laufenden Prozesses kann nicht geändert werden.
  • Dieser gesamte Prozess wäre drastisch einfacher, wenn Vista nicht in der Gleichung enthalten wäre.
1

Wenn Sie ShellExecute Semantik benötigen Sie folgende ernähren können:

C:\windwos\system32\cmd.exe /k" start <your_target_to_be_ShellExecuted>" zu CreateProcessAsUser und Sie sind fertig.

+0

Ich verwende bereits einen Hilfsprozess, das möchte ich entfernen, damit ich den richtigen Elternprozess erhalte – Anders