Sorry, aber da gibt es eine Menge anderer Gründe warum es nicht gehen wird und das alles, ohne dass
UAC überhaupt dabei ist.
Hast du die
MSDN von SetThreadDesktop mal gelesen?
Zitat:
The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a
handle to the current desktop).
Also wenn du
VCL verwendest, dann wird es schwierig, denn dann muss du versuchen diese zu beenden und dann diese neuzustarten.
VCL hat soviele Handles und Hooks. Und wenn da eine Komponente sich nicht sauber beendet, dann ist es vorbei.
Zitat:
Warning There is a significant security risk for any service that opens a window on the interactive desktop. By opening a desktop window, a service makes itself vulnerable to attack from the logged-on user, whose application could send malicious messages to the service's desktop window and affect its ability to function.
Auch wenn du als SYSTEM drin bist, dann ist deine Anwendung ein hohes Sicherheitsrisiko.
Wenn du die App als User "ar" gestartet hast und der Benutzer "z" loggt sich ein, dann gibt es zwei Probleme:
1. Vermutlich befindet sich Benutzer "ar" in einer anderen Terminalsitzung (0 in XP, 1 in >= Vista) und damit gibt es keine Chance zu wechseln. (Prüfe das mit Taskmgr oder ProcessExplorer. Stichwort: SessionID)
2. Benutzer ar hat kein Zugriff auf den Destkop von Benutzer z. D.h. ein SYSTEM Programm muss die DACL der Windowstation und Desktops von z ändern, damit das Programm dort überhaupt etwas anzeigen kann.
Es wäre besser die Anwendung neuzustarten oder den Teil, der Systemrechte benötigt in einen Dienst auszulagern und über Client-/Serverkommunikation den Status anzuzeigen.