2009-04-07 12 views
5

Ich habe eine Anwendung, die als normaler Benutzer ausgeführt wird, und einen Dienst, der als lokales System ausgeführt wird. Ich möchte, dass die Anwendung dem Dienst mitteilen kann, dass er die Anwendung erneut starten soll, sobald der Dienst einige andere Aufgaben erledigt hat. (Die Anwendung wird also nicht ausgeführt, während der Dienst es ausführt.) Damit der Dienst die Anwendung als der Benutzer starten kann, der ihn zuerst gestartet hat, benötigt er ein Benutzer-Token. Die Anwendung sendet das Token an den Dienst, bevor es beendet wird, aber das Token/Handle ist ungültig, wenn der Dienst versucht, es zu verwenden. (Das erste, was damit geschieht, ist DuplicateTokenEx, um ein primäres Token zu erhalten.)Wie erhalte ich ein gültiges Benutzer-Token für CreateProcessAsUser?

Ist ein Benutzer-Token immer nur in dem Prozess gültig, der OpenProcessToken genannt wird?

Gibt es eine andere Möglichkeit, dies zu tun? Ich möchte nicht, dass sich der Benutzer mit logonuser bei der Anwendung anmelden muss. Das wäre nur albern. Ich denke, ich könnte einen Prozess-Handle für "explorer.exe" von der App an den Dienst übergeben, den der Dienst verwenden könnte, um ein Benutzer-Token zu erhalten, aber das würde PROZESS DUP HANDLE Zugriffsrecht erfordern. Ich bin nicht begeistert von dieser Lösung, aber vielleicht ist es der Weg, es zu tun? hier

Antwort

2
+0

Danke, ich gehe mit dem ersten Artikel, Erstellen eines Token mit ZwCreateToken. Es ist ein wenig chaotisch, all das Zeug, das ich brauche, in eine Nachricht zu packen, aber anscheinend hat es für andere funktioniert. –

+0

Der erste Artikel scheint einige Fehler zu haben, der zweite sieht ziemlich gut aus.Aber ich bin nicht sicher, warum Sie ZwCreateToken (eine undokumentierte, nicht unterstützte und nicht ganz stabile Methode) verwenden würden, wenn es dokumentierte Methoden gibt, das zu tun, was Sie wollen. –

+0

Sorry, ich meinte zweitens. Konnte nicht einmal das erste finden. Ich mache etwas wie http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Verweisen Sie auf CreateToken? –

3

Sie haben hier mehrere Probleme so werde ich versuchen, sie einzeln zu adressieren und Sie können mich korrigieren, wenn ich falsch verstanden haben:

  1. Sie scheinen einen Service zu haben und eine Benutzeranwendung, die bestimmte Funktionen nicht gleichzeitig ausführen kann. Um dies zu erreichen, muss der Dienst die Anwendung stoppen, die spezielle Funktionalität ausführen und dann die Anwendung neu starten. Wenn das stimmt, dann haben Sie meines Erachtens einen Konstruktionsfehler. Anstatt zu stoppen und dann die Anwendung neu zu starten, sollten Sie den Zugriff auf die freigegebene Ressource durch gegenseitigen Ausschluss unter Verwendung eines benannten Mutex und/oder mithilfe einer IPC-Methode wie Named Pipes zum Kommunizieren von Absichten koordinieren.

  2. Ist ein Benutzer-Token immer nur in dem Prozess gültig, der OpenProcessToken genannt wird? Ja, das Token-Handle, das Sie erhalten haben, ist ein Index in die Handle-Tabelle des Prozesses, es ist nicht direkt übertragbar. Sie müssten DuplicateHandle verwenden, was möglicherweise das ist, was Sie wollen, aber könnte chaotisch sein.

  3. Sie möchten den besten Weg finden, das Token des Benutzers zum Starten der Anwendung in die (interaktive?) Sitzung des Benutzers zu bekommen. Wenn dies der Fall ist, besteht der beste Weg darin, das Sitzungstoken des Benutzers abzurufen und zu verwenden. Sie können this article und den Beispielcode auschecken, es ist in C#, sollte aber relativ einfach in Ihre Sprache Ihrer Wahl übertragen werden.

EDIT: Aktualisierte Windows 2000 enthalten Da Sie den Dienst unter dem System ausgeführt werden Account ein Handle für den Prozess öffnen kann selbst (falls erforderlich der Prozess seinen Prozess-ID senden). Er kann dann das mit diesem Prozess verbundene Token öffnen, es duplizieren und das resultierende Token verwenden, um die Zielanwendung zu starten (oder erneut zu starten).

+0

1. Könnte wie ein Designfehler erscheinen. Die Sache ist, der Dienst möchte möglicherweise die Anwendung aktualisieren: Es ist möglicherweise nicht die gleiche Anwendung, die gestartet werden sollte. 2. Einverstanden, ist es. Ich werde stattdessen versuchen, ein neues Token zu erstellen. 3. Muss auf 2000 arbeiten, vergessen zu erwähnen, dass ... –

+0

Warum ruft der Dienst nicht nur OpenProcessToken und DuplicateTokenEx selbst, anstatt den Prozess etwas an den Dienst senden? –

+0

Wird der erstellte Prozess in diesem Fall nicht als lokales System ausgeführt? Wenn ich das tue, könnte ich genauso CreateProcess aufrufen und mich überhaupt nicht mit Benutzer-Token herumschlagen. –

Verwandte Themen