Exe als Admin ausführen
-
Hi,
ich versuche eine exe als Admin auszuführen. Das ist wichtig, da diese der Updater ist und dringend Schreibrechte braucht (Diskussion über diese Umsetzung soll nicht Gegenstand des Threads sein, meine Kunden sind damit sehr zufrieden).
Problem: Die exe wird zwar ausgeführt, jedoch auf manchen Systemen nicht als Admin ausgeführt... Äußert sich darin, dass keine Schreiboperationen ausgeführt werden. Startet man die Datei manuell als Admin, dann funktioniert es.
Manche Systeme konnte ich bisher nicht eingrenzen. Auf meiner x64 Win7 Professional funktioniert es, auf einem x64 Win7 Ultimate beispielsweise wiederum nicht. Möglicherweise sind andere Einstellungen ausschlaggebend oder es gibt einen für mich zufälligen Faktor?!
Ich mache das so:
HINSTANCE result = ::ShellExecuteA(0, "runas", "Updater.exe", 0, 0, SW_SHOWNORMAL);
Ist das so korrekt oder mache ich vielleicht einfach etwas falsch, was nicht auf allen Windows-Versionen läuft? Wichtig anzumerken ist vielleicht noch, dass mein aufrufendes Programm keine Adminrechte hat und auch nicht haben soll.
Der Updater hat zwar eine Manifestdatei eingebunden, die requireAdministrator nutzt, das scheint jedoch auch nicht zu helfen.
Danke schon Mal und beste Grüße!
Eisflamme
-
Eisflamme schrieb:
Der Updater hat zwar eine Manifestdatei eingebunden, die requireAdministrator nutzt, das scheint jedoch auch nicht zu helfen.
Kommt denn wenigstens die UAC-Abfrage immer bei manuellem Aufruf?
-
http://www.c-plusplus.net/forum/275420-full
oder
http://www.codeproject.com/Articles/16796/Riding-the-Vista-UAC-elevator-up-and-down
-
Eisflamme schrieb:
Auf meiner x64 Win7 Professional funktioniert es, auf einem x64 Win7 Ultimate beispielsweise wiederum nicht. Möglicherweise sind andere Einstellungen ausschlaggebend oder es gibt einen für mich zufälligen Faktor?
Die Ultimate Version könnte tatsächlich mit schwereren Sicherheitsvorkehrungen ausgestattet sein oder Einstellungen unternommen worden sein, die diese verschärfen.
Mein erster Gedanke wäre, dass ein Programm mit Nutzer-Rechten kein Programm mit Admin-Rechten aufrufen kann.
-
Beachte auch bitte dies:
http://blog.kalmbach-software.de/2009/06/09/custom-installer-without-warning-dialog-trustedinstallerexe/Du musst auf jeden Fall ein UAC-Manifest einbinden in Deine EXE, damit es immer als Admin ausgeführt wird!!!
-
Dein Programm benötigt in jedem Fall ein Manifest requireAdministrator.
Nichts desto trotz musst Du auf einem Rechner der kein UAC hat bzw. ausgestellt ist, prüfen ob Du Admin bist!!!
-
Hi,
bin nun alle Links und Posts durchgegangen, danke schon Mal!
Also UAC ist eingebunden. Das ist erkennbar an dem Windows-Siegel im Icon. Bei manueller Ausführung mit ausgeschaltetem UAC führt er bei mir die Software wie gewünscht als Admin aus. Schalte ich es ein, so fragt er bei manuellem Aufruf brav jedes Mal nach, ob man der SW auch vertraut. Wird der Updater über meine Applikation ausgeführt, zeigt sich bei mir dasselbe Resultat, aber leider nicht bei allen Anwendern (suche noch nach einem, mit dem ich testen kann).
Den Updater in TrustedInstaller.exe umzubenennen ändert nichts auf meinem System - aber da klappt es ja sowieso. Und den Aufruf der exe über ShellExecute mache ich ja brav über runas.
Nichts desto trotz musst Du auf einem Rechner der kein UAC hat bzw. ausgestellt ist, prüfen ob Du Admin bist!!!
Okay, das impliziert ja, dass elevated execution offensichtlich nicht zuverlässig funktioniert.
Andere Software bei den betroffenen Personen funktioniert jedoch in exakt derselben Weise (Aufruf eines Updaters von einem non-elevated Programm). Gibt es nichts, was ich sonst noch evtl. falsch mache?
Okay und wenn der Updater erkennt, dass er keine Adminrechte hat, was würdet ihr dann vorschlagen? Messagebox mit sinngemäß "Bitte in Ordner gehen und Updater.exe selbst aufrufen?" Das funktioniert bei den Menschen nämlich immer.
-
Das UAC-Manifest ist erst ab Windows VIsta bekannt...
-
Eisflamme schrieb:
Okay, das impliziert ja, dass elevated execution offensichtlich nicht zuverlässig funktioniert.
Andere Software bei den betroffenen Personen funktioniert jedoch in exakt derselben Weise (Aufruf eines Updaters von einem non-elevated Programm). Gibt es nichts, was ich sonst noch evtl. falsch mache?
Okay und wenn der Updater erkennt, dass er keine Adminrechte hat, was würdet ihr dann vorschlagen? Messagebox mit sinngemäß "Bitte in Ordner gehen und Updater.exe selbst aufrufen?" Das funktioniert bei den Menschen nämlich immer.
Quatsch. Wenn man UAC ausschaltet, dann man keine Elevated Execution. Dann läuft alles nach frage der Rechte...
Was soll da "nicht zuverlässig" funktionieren! Des Kunden Wille ist sein Himmelreich.Wenn Du dann keine Admin Rechte hast musst Du den Kunden eben bitten das Programm von einem Admin ausführen zu lassen. Wie den sonst. So war es ja auch zu XP Zeiten!
Und Jochen meinte nicht, Dein Programm umzubennenen. Wenn ein Programm kein UAC Maifest hat, dann erkennt Vista/Win7 am Namen evtl. einen Insaller!
Nochmal zur Sicherheit: Dein Updater hat definitv ein Manifest und das ist korrekt requireAdmin? Stelle mal testweise auf asInvoker um.
Was passiert dann?
-
Hi,
sorry, das Problem lag ganz woanders...
Mein Installer-Ersteller (NSIS) hat einen Unterordner für Lizenzen erstellt (soweit okay). Das "aktuelle Verzeichnis" habe ich nicht im Skript zurückgestellt, sodass alle Verknüpfungen mit dem Verzeichnis=/Licenses erstellt wurden. War nicht auffällig, weil die Verknüpfungen ganz normal dort abgelegt wurden, wo sie waren und auch funktionierten. Das hatte lediglich zur Folge, dass "Ausführen in" ins Licenses-Verzeichnis lief. Somit liefen alle Updates und Dateientpackungen in dieses Verzeichnis, dann wurde die korrekte Applikation gestartet, war aber logischerweise nicht aktualisiert.
Ich habe also an der völlig falschen Stelle gesucht. Darauf, dass "Ausführen in" falsch gesetzt ist, muss man erstmal kommen.
Leider habe ich die Falschannahme als Tatsache dargestellt, typischer Foren-Anfängerfehler. Dafür gesondert: Entschuldigung.
Jetzt funktioniert alles einwandfrei. Eure Informationen haben mir im Verständnis dennoch sehr weitergeholfen, somit herzlichen Dank!
Beste Grüße,
Eisflamme