Hallo zusammen
Ich habe eine grössere Applikation, welche beim Starten Admin-Rechte benötigt, falls ein Update veröffentlicht wird. In diesem Fall wird der UAC-Dialog ausgelöst und die Applikation mit "runas" programmatisch neu gestartet. Funktioniert alles wunderbar, ist aber nicht unbedingt benutzerfreundlich.
Nun ist meine Frage, wie ist es möglich, die Admin-Rechte nicht für einen ganzen Prozess, sondern nur für einen Thread anzuwenden und so den Programmneustart hinfällig zu machen? Oder vielleicht habt ihr ganz andere Ansätze, wie man sowas geschmeidig implementieren kann?
Es gibt Programme wie z.B. Total Commander, die bei Kopiervorgängen auch den UAC-Dialog anzeigen und keinen Neustart benötigen, um den Vorgang abzuschliessen. 🤔
Es gibt Programme wie z.B. Total Commander, die bei Kopiervorgängen auch den UAC-Dialog anzeigen und keinen Neustart benötigen, um den Vorgang abzuschliessen.
Du kannst ja z.B. deiner Programminstanz, die du als Admin startest, einen Parameter übergeben, der sie dazu veranlasst, nur zu updaten und sich sofort wieder zu beenden.
Wobei ich mir ein Update ohne Neustart auch nur schwer vorstellen kann 😉
Ich glaube, am einfachsten ist es, wenn ich eine kleine zusätzliche Exe bastle, welche als Admin ausgeführt wird, die nötigen Operationen durchführt und sich selber beendet.
"Inspiriert" wurde ich vom folgenden Thread: UAC + RedirectStandardOutput
Wobei ich mir ein Update ohne Neustart auch nur schwer vorstellen kann
korrekt. Es geht nicht ohne neustart, wenn sich die Anwendung selbst updated, da man keine Assemblies aus einer appdomain entladen kann. Wenn diese zudem noch in der HauptAppDomain liegen hat man schon keine andere Wahl.
Hmm, ich sehe ich habe meine Problemstellung unvollständig erklärt. X(
Das Programm updated nicht sich selber, sondern ein anderes. Zuerst wird nur ein kleines Programm gestartet, welches nach Updates für das grosse Programm schaut und sich bei Bedarf um die weiteren Schritte kümmert. Dann startet es das grosse Programm und beendet sich gleichzeitig.
Leider wird das grosse Programm auch automatisch mit Admin-Rechten gestartet, wenn das kleine diese durch seinen Neustart erhalten hat. Dies ist eigentlich nicht erwünscht und wäre automatisch auch gelöst, wenn eine noch kleinere, dritte Exe sich um die adminkritischen Operationen kümmert und mit runas vom kleinen Programm aus gestartet wird.
Du kannst in deinem Programm wenn du eine Adminoperation ausführen willst das Programm selbst wieder aufrufen und diesem mit einem Startparameter sagen, was es machen soll. In deinem eigenen Programm wartest du dann bis der neue Process beendet wurde und machst dann mit den Sachen weiter, die keine Adminrechte brauchen. Da brauchst du dann nicht noch ein zusätzliches Programm.
Darth Maim
Nach weiterem Recherchieren und herumspielen mit dem Total Commander, werde ich die Lösung mit dem kleinen Kopier-Exe implementieren, da wir diese Variante auch im grossen Programm wiederverwenden können.
Elevated rights auf Thread-Ebene ist by Design nicht möglich unter Windows.
Btw, Total Commander kocht auch nur mit Wasser. Er erstellt ganz heimlich eben auch einen weiteren Prozess, welcher mit Admin credentials läuft und dann wohl per Interprozesskommunikation die Anweisungen erhält.
Was du willst nennt sich COM Elevation Moniker:
UAC Elevation in Managed Code: Guidance for Implementing COM Elevation