Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Adminrechte anfordern (https://www.delphipraxis.net/113712-adminrechte-anfordern.html)

xZise 13. Mai 2008 13:16


Adminrechte anfordern
 
Hallo DP,
ich programmiere gerade an Qd2.
Dort kann es nun mal vorkommen, dass man Adminrechte benötigt, um z.B. im Programmordner was downloadet (Stichwort Locomotion ;)).

Wie kann ich das nun erreichen?
Neustarten ist eigentlich nicht möglich, weil vom Anfang an nicht klar ist, ob ich Adminrechte benötige.

MfG
xZise

dominikkv 13. Mai 2008 13:23

Re: Adminrechte anfordern
 
Du kannst dich zB mit runas neu starten.
PS: In Daniels Videos wird das erklärt ;)

Daniel 13. Mai 2008 13:24

Re: Adminrechte anfordern
 
Nimm' Dir das Beispiel von sakura, in dem er einen sog. "Out of Process" Com-Server erzeugt. Deine eigene Anwendung kann zur Laufzeit die Rechte-Ebene nicht wechseln. Deswegen muss ein neuer Prozess gestartet werden, für den dann die gewünschten Rechte gefordert werden können.

Den genauen Link zu seinem Beispiel habe ich jetzt nicht zu Hand, aber unter http://www.gumpi.com/Blog/Special.aspx?=Conferences könntest Du in einem der Vista-Archive fündig werden.

xZise 13. Mai 2008 13:29

Re: Adminrechte anfordern
 
Okay, dass ist natürlich nicht so günstig, weil ich zur Lauzeit neustarten müsste, und im Ram alles Mögliche sein könnte.

Andere Möglichkeit: Wäre es vielleicht sinnvoll die Datei nachher zu verschieben, und das Verschieben mit Adminrechten zu machen? So ähnlich wie beim Verschieben von Dateien im Explorer?

MfG
xZise

Dezipaitor 13. Mai 2008 19:47

Re: Adminrechte anfordern
 
Lasse deine Anwendung sich selbst starten mit ein paar Spezialparametern. Mein RunAsSys macht es genauso. Dort geht es sogar soweit, dass sie sich selbst als Service kurzzeitig registriert. Benutzer -> Admin -> Dienst.

xZise 13. Mai 2008 19:58

Re: Adminrechte anfordern
 
Spezialparameter?
Ich müsste eine ganze Objektliste übergeben.
Das hieße ungefähr 7 Eigenschaften pro Objekt, was bei vielleicht 20 schon 140 Parameter ausmacht.

Ist es da nicht wesentlich einfacher, zu überprüfen, ob ich in den Ordner schreiben kann, und andernfalls eine "Dateioperation" in Gang setze, welche das dann kopiert?

MfG
xZise

Dezipaitor 13. Mai 2008 20:04

Re: Adminrechte anfordern
 
Das ist doch dasselbe.
Du erstellst eine Datei in einem Tempordner. Dann rufst du dein Programm auf, welches zum Admin wird und diese Datei dorthin kopiert, wohin du es haben willst. Das ist eben eine andere Art der Interprozesskommunikation. Du könntest natürlich auch Pipes oder MMF verwenden. Objekte zu transferieren geht eigentlich am leichtesten über Serialisierung.

xZise 13. Mai 2008 20:43

Re: Adminrechte anfordern
 
Okay, also du meinst, ich schreibe ein Art "Copy.exe", welche mir eine Datei kopiert? So könnte es gehen.

MfG
xZise

Luckie 14. Mai 2008 08:01

Re: Adminrechte anfordern
 
Zitat:

Zitat von Daniel
Deine eigene Anwendung kann zur Laufzeit die Rechte-Ebene nicht wechseln.

Das stimmt so nicht. Mit MSDN-Library durchsuchenImpersonateLoggedOnUser geht es. Siehe dazu auch meinen Artikel: http://www.michael-puff.de/Artikel/Impersonate.php

Daniel 14. Mai 2008 08:42

Re: Adminrechte anfordern
 
Du kannst einen neuen Prozess starten, der dann beliebige Rechte hat, aber wenn ein Prozess einmal läuft, kann dieser nicht in der Rechte-Hierarchie von Vista auf- oder absteigen.

Luckie 14. Mai 2008 08:53

Re: Adminrechte anfordern
 
Nicht unter dem gleichen Benutzer, das ist richtig.

Dezipaitor 14. Mai 2008 10:36

Re: Adminrechte anfordern
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Daniel
Deine eigene Anwendung kann zur Laufzeit die Rechte-Ebene nicht wechseln.

Das stimmt so nicht. Mit MSDN-Library durchsuchenImpersonateLoggedOnUser geht es. Siehe dazu auch meinen Artikel: http://www.michael-puff.de/Artikel/Impersonate.php

Jupp, geht so. Aber dazu braucht man das impersonate Privileg. Das haben im Normalfall nur Admins.

xZise 25. Mai 2008 12:23

Re: Adminrechte anfordern
 
So ich habe mich nochmal damit auseinander gesetzt und möchte das nun so machen:
  1. Download aller Dateien in einen Temporären Ordner
  2. Test ob das Programm dareinschreiben kann
    • Ja -> Datei kopieren
    • Nein -> Datei zur Kopierwarteschlange hinzufügen
  3. Nachdem alle Dateien getestet wurden (Pkt 2), Copy.exe ausführen mit den noch zu kopierenden Dateien (Kopierwarteschlange).

Meine Frage ist nun: Wie kann ich herausfinden, ob ich in den Ordner kopieren kann.
Am besten mit Abwärtskompatibilität.

MfG
xZise

Dezipaitor 25. Mai 2008 12:38

Re: Adminrechte anfordern
 
Du kannst versuchen darin eine Datei zu erstellen oder du verwendest AccessCheck .

xZise 25. Mai 2008 12:41

Re: Adminrechte anfordern
 
Hi Dezipaitor,

Zitat:

Zitat von Dezipaitor
Du kannst versuchen darin eine Datei zu erstellen

Und dann wird möglicherweise der Ordner virtualisiert ;)

Zitat:

Zitat von Dezipaitor
oder du verwendest AccessCheck .

Hmmm, ich guck mir mal an was das ist.

MfG
xZise

Dezipaitor 25. Mai 2008 13:41

Re: Adminrechte anfordern
 
Wenn du ein Manifest verwendest, dann wird der Ordner sicher nicht virtualisiert. Zudem gibt es im Token eine Info, ob Virtualisierung an ist. (TJwSecurityToken.VirtualizationEnabled)

In der JWSCL gibt es sowas schon: (ist aus dem ReadFileSecurity Beispiel)
http://jedi-apilib.svn.sourceforge.n...33&view=markup

romber 1. Jul 2008 18:36

Re: Adminrechte anfordern
 
Zitat:

Zitat von Dezipaitor
Das ist doch dasselbe.
Du erstellst eine Datei in einem Tempordner. Dann rufst du dein Programm auf, welches zum Admin wird und diese Datei dorthin kopiert, wohin du es haben willst. Das ist eben eine andere Art der Interprozesskommunikation. Du könntest natürlich auch Pipes oder MMF verwenden. Objekte zu transferieren geht eigentlich am leichtesten über Serialisierung.

Das dachte ich mir auch und habe genau so gemacht. Ein Programm mir "normalen" Rechten lädt die Dateien herunter, speichert diese im Temp-Verzeichniss und versucht dann eine andere Exe-Datei, die mit einem Manofest versehen ist, zu starten. Fehlanzeige! Die Anwendung wird nicht mal gestartet! Ein Process, das höhere Rechte erfordert startet nun mal nicht aus einem Prosess, das niedrigere Rechte besitzt. Ich verstehe immer noch nicht, wie dieses Problemm gelöst wird.

Dezipaitor 1. Jul 2008 19:05

Re: Adminrechte anfordern
 
Wenn das Manifest requireAdministrator enthätl, kann man die Anwendung nicht mit CreateProcess aufrufen, sondern nur mit ShellExecute. Dann kommt der UAC Dialog.

romber 1. Jul 2008 21:34

Re: Adminrechte anfordern
 
Bei mir soll das Hauptteil warten, bis Admin-Teil fertig ist und dann weiter arbeiten. Mit ShellExecute wird das etwas komplizierter.

Gibt es irgendwelche Parameter, mit den man ein Programm mit Adminrechten starten kann, ohne ein Manifest erstellne zu müssen?

Dezipaitor 1. Jul 2008 21:49

Re: Adminrechte anfordern
 
jo : ShellExecute
ShellExecuteEx gibt dir ein Prozesshandle zurück. Da kann man drauf warten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz