WTSQueryUserToken wird nur innerhalb eines Service mit aktivem TCB-Privilege funktionieren.
Es ist nicht ganz klar, ob das "andere Programm" mit dem selben User, aber ohne Elevation ausgeführt werden soll, oder als gänzlich anderer User.
Für die Situation, dass eine Un-Elevation ausgeführt werden soll, bieten sich die APIs
CreateRestrictedToken oder
SaferComputeTokenFromLevel an, um ein eingeschränktes Token zu erstellen, das dann für
CreateProcessAsUser verwendet werden kann, um das "andere Programm" un-elevated zu starten.
Siehe auch:
https://stackoverflow.com/questions/...s-from-process
Vielleicht sollte ich mal beschreiben, worum es geht.
Standard-Mäßig startet mein Dateimanager-programm mit normalen User-Rechten. Für manche Aufgaben braucht man Admin-Rechte. Das löse ich so, dass einmal ein externes Programm mit Admin-Rechten gestartet wird welches die Aufgaben dann erledigt. Manchmal braucht das Dateimanager-Programm aber selber Adminrechte, um. z.B. bestimmte Verzeichnisse anzuzeigen, die man überhaupt nur mit Adminrechten zu sehen bekommt. Das mache dann so, dass das erwähnte Hilfsprogramm gestartet wird, das Dateimanager-programm beendet wird und dann das Hilfsprogramm das Dateimanager-Programm wieder mit Admin-Rechten startet.
Dann ist die Aufgabe erledigt und man möchte das Datamanager-Programm wieder nur mit User-Rechten laufen lassen. Also wird das Hilfsprogramm wieder aufgerufen, das Dateimanager Programm beendet und das Hilfsprogramm soll das Dateimanager-Programm wieder mit einfachen User-Rechten starten.
Nur - Das Dateimanager-Programm hatte ja zuletzt Admin-Rechte, so dass der aufgerufene Prozess (das Hilfsprogramm) auch Admin-Rechte hat. Das mit Admin-Rechten laufende Hilfsprogramm soll aber dennoch das Dateimanager-Programm nur mit User-Rechten starten.