Discussion:
Admin-Rechte loswerden
(zu alt für eine Antwort)
Matthias Hanft
2016-02-05 08:44:33 UTC
Permalink
Hallo,

gibts irgendwo ein Delphi-Beispiel (notfalls auch VB, C etc.), wie ein
Programm seine Admin-Rechte los wird? Ich habe schon herausgefunden,
dass man dazu offenbar diese Funktion braucht
https://msdn.microsoft.com/en-us/library/aa375202%28VS.85%29.aspx
aber wie man die aufruft (woher hat man z.B. das "TokenHandle"?), ist
mir etwas schleierhaft... da wäre ein Codeschnipsel ganz hilfreich.

Hintergrund: Ich lasse den Anwender mein Delphi-Programm mit Install-
Shield installieren. Das hat natürlich Admin-Rechte, damit es sich
selbst ins Programmverzeichnis schreiben darf. Auf der letzten
InstallShield-Seite gibts ja dann das Ankreuzfeld "Programm
starten", damit mans gleich ausführen kann nach der Installation.
Und anscheinend hat das so gestartete Delphi-Programm dann immer
noch Admin-Rechte und darf auch weiterhin ins Programmverzeichnis
schreiben (und es sind wohl auch andere Netzwerklaufwerke aktiv
als die des "normalen" Benutzers, was zu Verwirrung führt, wenn
es im OpenDialog z.B. "X:\irgendwo\blabla" nicht gibt).

Daher würde ich beim Start das Programm gerne in den Zustand
versetzen, den es auch hätte, wenn es einfach ganz normal übers
Startmenü gestartet worden wäre. Geht das (mit der obigen
Funktion), und wenn ja, wie?

Danke & Gruß Matthias.
Achim Kalwa
2016-02-10 10:45:23 UTC
Permalink
Hallo Matthias,
Post by Matthias Hanft
gibts irgendwo ein Delphi-Beispiel (notfalls auch VB, C etc.), wie
ein Programm seine Admin-Rechte los wird? [...]
This is a reverse to ShellExecute("runas") This function will perform
ShellExecute in the context of original (unelevated) user The user
account is taken from running Explorer
http://pastebin.com/S9WLMDhB

Beim Start Deiner Anwendung musst dann prüfen, ob die Anwendung mit
Admin-Rechten ausgeführt wird. Dann muss sich die Anwendung mit obiger
Funktion selber noch einmal unelevated starten und die Original-Instanz
terminieren.
Post by Matthias Hanft
Hintergrund: Ich lasse den Anwender mein Delphi-Programm mit
Install- Shield installieren. Das hat natürlich Admin-Rechte, damit
es sich selbst ins Programmverzeichnis schreiben darf. Auf der
letzten InstallShield-Seite gibts ja dann das Ankreuzfeld "Programm
starten", damit mans gleich ausführen kann nach der Installation. Und
anscheinend hat das so gestartete Delphi-Programm dann immer noch
Admin-Rechte [...]
Das würde ich als einen Fehler von InstallShield betrachten. Falls es
Dir möglich ist, verwende statt dessen "Inno Setup":
http://www.jrsoftware.org/isdl.php

Dort gibt es auch die Möglichkeit, nach Abschluss der Installation die
Post by Matthias Hanft
runasoriginaluser
Valid only in a [Run] section. If this flag is specified and the
system is running Windows Vista or later, the spawned process will
execute with the (normally non-elevated) credentials of the user that
started Setup initially (i.e., the "pre-UAC dialog" credentials).
This is the default behavior when the postinstall flag is used.
HTH
Achim
Matthias Hanft
2016-02-10 11:09:46 UTC
Permalink
Post by Achim Kalwa
Post by Matthias Hanft
This is a reverse to ShellExecute("runas") This function will perform
ShellExecute in the context of original (unelevated) user The user
account is taken from running Explorer
http://pastebin.com/S9WLMDhB
Ah, danke, habs gleich mal runtergeladen.
Post by Achim Kalwa
Beim Start Deiner Anwendung musst dann prüfen, ob die Anwendung mit
Admin-Rechten ausgeführt wird. Dann muss sich die Anwendung mit obiger
Funktion selber noch einmal unelevated starten und die Original-Instanz
terminieren.
Ok. Ist zwar etwas umständlich, aber da weiß ich, wie's geht (eine
"function BinIchAdmin: Boolean" hab ich schon, und das eigene Programm
beenden und ein anderes neustarten mach ich z.B. bei der Update-
Funktion eh schon).
Post by Achim Kalwa
Das würde ich als einen Fehler von InstallShield betrachten. Falls es
http://www.jrsoftware.org/isdl.php
Das hab ich mir vor Jahren schon mal (oberflächlich) angeschaut,
wurde aber von der Fülle der Möglichkeiten ("eigerlegende Woll-
milchsau") etwas erschlagen... und never change running systems :-)
Post by Achim Kalwa
Dort gibt es auch die Möglichkeit, nach Abschluss der Installation die
Ah, ok. Ich bin auch gar nicht sicher, was InstallShield da genau
macht und konnte es auch nicht so 100%ig nachvollziehen. Jedenfalls
ist es einem Anwender irgendwie gelungen, ins Programmverzeichnis
(wo InstallShield meine EXE hininstalliert hat) seine Config-Dateien
zu schreiben, und "eigentlich" geht das ja gar nicht. Daraus meine
Schlussfolgerung, dass er mein Programm direkt mit "Programm starten"
auf dem letzten Installshield-Bildschirm gestartet hat und dass dabei
noch erhöhte Rechte vorliegen müssten. Aber vielleicht lags ja auch
an was ganz anderem...

Gruß Matthias.

Loading...