cosmo
Hallo Kay, noch etwas für deine To-do Liste:
Situation: Eingeschränkter SuRunner, der den Explorer nicht erweitert starten darf. Ruft ein solcher Benutzer nun den Neustart-Befehl auf, so hält sich SuRun zwar an die Einschränkung, allerdings schließt SuRun die laufende Shell bevor es mitteilt, daß die Berechtigung fehlt; die Shell wird notwendigerweise mit eingeschränkten Rechten wieder neu gestartet. Dabei können die in allen Fällen, in denen die Shell neu gestartet wird, bekannten Probleme auftreten, insbesondere fehlende Symbole von laufenden Programmen im Info-Bereich der Taskleiste. Ein Programm, das davon betroffen ist, ist SuRun selber - genauer gesagt natürlich das Traysymbol, das nach dem Neustart der Shell verschwunden bleibt.
SuRun sollte also vor dem Schließen eines Programms (bei anderen als dem Explorer ist es meistens nicht so arg, aber da sollten ähnliche Probleme auch nicht auftreten, ist ärgerlich) überprüfen, ob es das Programm als Administrator starten darf (und ohne Rechte eben geöffnet lassen).
Kay
Die einzige Möglichkeit, das zu umgehen, ist "Neustart als Administrator" ganz aus der Shell auszublenden.
Warum:
Die Info, dass ein SuRunner eingeschränkt ist, steht in "HKLM\SECURITY\SuRun\<ComputerName>\<UserName>".
Die kann der Shell-Prozess, in den SuRunExt.dll geladen ist, nicht lesen.
SuRunExt.dll ruft ExitProcess() auf, um den Prozess halbwegs "lieb" zu beenden. Das ist notwendig, damit dem Prozess die Möglichkeit gegeben wird, extern belegte Ressourcen wieder freizugeben. ExitProcess() kann nur den gerade laufenden Prozess beenden und muss dehalb von SuRunExt.dll aufgerufen werden. Das muss auch passieren, bevor SuRun.EXE startet, weil sonst ein "Singleton" (wie RegEdit.exe) nicht neu starten würde.
Viel später, nachdem der SuRun Dienst geprüft hat, ob der Benutzer nicht eingeschränkt ist, ruft der Dienst TerminateProcess() auf. Das ist eine "böse" Funktion, die dem Prozess nicht die Möglichkeit gibt, extern belegte Ressourcen wieder freizugeben. Temporäre Dateien etc. würden so also nicht gelöscht werden können.
cosmo
So weit verstanden.
Aber kann denn nicht SuRun die Prüfung über die Einschränkung des Surunners nicht ohne TerminateProcess() am Anfang ausführen und - sofern Berechtigung ok - über SuRunExt.dll ExitProcess() starten?
Kay
SuRun hat einfach keinen legalen Zugriff auf die in Explorer geladene SuRunExt.dll und kann deshalb von extern kein ExitProcess aufrufen.
Bin gerade am Beta stricken. Da wird "Neustart als Admin" aus der Shell ausgeblendet.
Hoffentlich reicht das ;)