(Im Folgenden sind Beiträge aus dem SuRun Forum zusammengefasst)
Wenn man „SuRun Explorer“ ausgeführt hatte und dieses Explorer-Fenster noch offen war, konnte man mit „Start->Ausführen ‚Explorer'“ keine neue Instanz des Explorer mehr starten. 😯 Erst, wenn das mit erhöhten Rechten laufende Fenster wieder zu war, ließ sich Explorer wieder mit normalen Rechten starten. Das Problem schien nicht SuRun-Spezifisch zu sein, denn mit SuDown und MachMichadmin hat man es auch.
Mit „Process Explorer“ und „Process Monitor“ fand ich heraus, dass der Explorer zwar startet, sich aber sofort wieder selbst beendet. Vor der Fertigstellung von SuRun 1.2 habe ich mir die Funktionsweise von Explorer mal näher angesehen.
Unter Windows „ab Vista“ gibt es den Explorer-Kommandozeilenparameter „/SEPARATE“. Damit startet Explorer immer einen separaten Prozess. SuRun benutzt den Parameter ab Version 1.2.0.0.
Unter Windows „vor Vista“ sendet ein neu gestarteter Explorer seine Kommandozeile per Windows Nachricht an einen bereits laufenden.
Ist „Ordnerfenster in eigenen Prozess starten“ AUS, sendet der neue Explorer die Nachricht an den Desktop, wartet, bis der Desktop diese Nachricht verarbeitet hat und beendet sich dann.
Ist „Ordnerfenster in eigenen Prozess starten“ EIN, sucht Explorer nach einem Fenster mit dem Klassennamen „Proxy Desktop„. Findet er kein solches Fenster, erstellt er selbst eins und läuft weiter. Findet Explorer ein Fenster der Klasse „Proxy Desktop„, sendet der neue Explorer seine Kommandozeile per Windows-Nachricht an dieses Fenster, wartet, bis es die Nachricht verarbeitet hat und beendet sich dann.
Deswegen sind trotz „Ordnerfenster in eigenen Prozess starten“ EIN immer maximal zwei Explorer.exe im System zu finden.
Warum geht das Starten neuer eingeschränkter Explorer nicht, nachdem ein administrativ laufender offen ist?
Der neu gestartete, eingeschränkte Explorer sendet seine Kommandozeile per Nachricht an den bereits laufenden.
So weit ok.
Dann versucht er zu warten, bis der „alte“, administrativ laufende Explorer die Nachricht verarbeitet hat.
Das macht er, indem er versucht herauszufinden, dass der „alte“ Explorer auf Benutzereingaben wartet (OpenProcess, WaitForInputIdle).
Dazu (OpenProcess) hat er jedoch keine Berechtigung.
Dann beendet der „neue“ Explorer sich sofort und der „alte“ kann die Kommandozeile nicht mehr aus dem „neuen“ auslesen. Dadurch scheint es, dass kein neuer Explorer mehr startet.
Wie kann man trotzdem einen neuen Explorer starten?
Man muss,
- „Ordnerfenster in eigenen Prozess starten“ auf EIN setzen,
- alle Fenster mit dem Klassennamen „Proxy Desktop“ (WM_CLOSE) schließen.
- den „neuen“ Explorer starten
- warten, bis der „neue“ Explorer sein „Proxy Desktop“ Fenster erstellt hat und es schließen (WM_CLOSE)
- „Ordnerfenster in eigenen Prozess starten“ wieder auf AUS setzen, wenn das vorher aus war