Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Adminrechte nur verlangen, wenn benötigt. (https://www.delphipraxis.net/137313-adminrechte-nur-verlangen-wenn-benoetigt.html)

dimholz 18. Jul 2009 15:04


Adminrechte nur verlangen, wenn benötigt.
 
Hi,
ich habe folgendes Problem:

Mein Updater soll erkennen, ob er zum Schreiben in den eigenen Ordner Adminrechte benötigt (z.B. wenn er in C:\Programme liegt).

Ich dachte mir am Anfang, dass ich es so realisieren könnte, dass das Programm versucht eine Testdatei im Hauptordner zu erstellen und dann prüft, ob diese denn auch vorhanden ist.
Nur leider schiebt Vista/7 diese Datei ohne Adminrechte in einen virtuellen Ordner und das Programm gibt immer aus, dass die Datei existiert - egal ob es nun im echten Ordner liegt oder nicht.

Delphi-Quellcode:
needuac:=true;
copyfile(pchar(application.exename),pchar(application.exename+'.bak'),false);
showmessage(application.exename+'.bak');
if fileexists(application.exename+'.bak') then begin
  deletefile(application.exename+'.bak');
  needuac:=false;
end;
Deswegen meine Frage an euch: Wie kann ich überprüfen lassen, ob das Programm Schreibrechte für den Ordner xy benötigt, sodass es ggf nach Adminrechten fordert.

Danke für eure Hilfe

MfG
Dimholz

Sharky 18. Jul 2009 15:16

Re: Adminrechte nur verlangen, wenn benötigt.
 
Hai Dimholz,

erst einmal: "Herzlich Willkommen in der Delphi-PRAXiS".

Ich würde anders an die Sache gehen. Prüfe ob der angemeldete Benutzer Adminrechte hat oder nicht. Wenn nicht gib eine Meldung aus das Updates nur von einem Administrator eingespielt werden können.

dimholz 18. Jul 2009 15:31

Re: Adminrechte nur verlangen, wenn benötigt.
 
Zitat:

erst einmal: "Herzlich Willkommen in der Delphi-PRAXiS".
Danke, danke :)

Im Grunde genommen soll mein Updater auch ohne Adminrechte funktionieren, wenn er z.B. nur in einem nicht geschützten Bereich (wie Desktop oder andere Partitionen) schreiben muss.

Allein wenn Adminrechte zwingend benötigt werden, soll eine UAC-Abfrage kommen. Bis jetzt hatte ich das Programm so eingestellt, dass es immer einen UAC-Dialog anzeigte. Dies möchte ich aber nun ändern.

MfG
Dimholz

Apollonius 18. Jul 2009 15:33

Re: Adminrechte nur verlangen, wenn benötigt.
 
Ich denke eher, dass du die Dateisystemvirtualisierung abschalten solltest - dann dürfte CopyFile nämlich einen Fehler liefern. Wie du das erreichst, sollte in diversen anderen Threads stehen.

Phoenix 18. Jul 2009 15:59

Re: Adminrechte nur verlangen, wenn benötigt.
 
Mittels einen einfachen API-Calls kannst Du herausfinden, ob die Applikation gerade Admin-Rechte hat oder nicht: http://msdn.microsoft.com/en-us/library/bb776463(VS.85).aspx

Du kannst für eine laufende Anwendung nicht einfach nachträglich Adminrechte abrufen, aber mittels der Restart & Recovery API kannst Du Deine Applikation selber beenden und dann mit Adminrechten (UAC) vom Betriebssystem neu starten lassen. Der Taskmanager unter Windows macht das z.B. wenn Du ihn startest und dann unten auf den Button drückst um die Prozesse aller User anzeigen zu lassen.

Ist eigentlich relativ einfach.

Bernhard Geyer 18. Jul 2009 16:05

Re: Adminrechte nur verlangen, wenn benötigt.
 
Zitat:

Zitat von dimholz
Nur leider schiebt Vista/7 diese Datei ohne Adminrechte in einen virtuellen Ordner und das Programm gibt immer aus, dass die Datei existiert - egal ob es nun im echten Ordner liegt oder nicht.

Geschieht nur wenn du der Exe keine passende Manifestinformationen mitgiebst. Hierrüber wird die Virtualisierung abgeschalten.

Phoenix 18. Jul 2009 16:08

Re: Adminrechte nur verlangen, wenn benötigt.
 
Zitat:

Zitat von Apollonius
Ich denke eher, dass du die Dateisystemvirtualisierung abschalten solltest - dann dürfte CopyFile nämlich einen Fehler liefern.

Hrm. Das ist irgendwie wie: "Ich fahre jetzt gegen einen Baum, nur um meinen Airbag zu testen.".
Nein, man sollte keinen Berechtigungs-Fehler provizieren um zu prüfen ob eine Berechtigung da ist oder nicht. Dazu gibt es (wie von mir verlinkt) IsUserAdmin. Das funktioniert auch mit Elevation richtig: Ist man zwar in der Admingruppe, der Prozess hat aber keine Adminrechte liefert das false, ist der Prozess mit erhöhten Berechtigungen aktiv true.

Das ist imho um längen sauberer und umgeht das geterze mit der Virtualisierung ganz sauber.

Apollonius 18. Jul 2009 16:16

Re: Adminrechte nur verlangen, wenn benötigt.
 
Sicher, so sollte man nicht prüfen, ob man Admin ist. Aber der Threadersteller will ja eigentlich nur in ein bestimmtes Verzeichnis schreiben - und insbesondere nicht Administratorrechte anfordern, wenn er in ein privates Verzeichnis schreiben will. Da hilft dann IsUserAnAdmin nicht. Nebenbei bemerkt sollte auch IsUserAdmin nicht verwendet werden - es ist nicht sicher, dass die Funktion in späteren Windows-Versionen auch existiert.

himitsu 18. Jul 2009 16:22

Re: Adminrechte nur verlangen, wenn benötigt.
 
Zitat:

Zitat von Phoenix
Mittels einen einfachen API-Calls kannst Du herausfinden, ob die Applikation gerade Admin-Rechte hat oder nicht: http://msdn.microsoft.com/en-us/library/bb776463(VS.85).aspx

Nur besagt das nicht, ob die Anwendung auch Adminrechte hat.

Selbst wenn der User Admin ist, kann er die nwendung ja unter einem Gastkono laufen lassen
oder ein Benutzer läßt die Anwendung mit Adminrechten lausführen.

Und dan gibt es ja seit Vista (?) irgendwie 2 Tokens,
wonach ein Programm (wenn es von einem Admin einfach so) gestartet wird und nicht explizit Adminrechte verlangt,
dann läuft es da mit eingeschränkten Adminrechten

.... oder irgendwie so

dimholz 18. Jul 2009 18:22

Re: Adminrechte nur verlangen, wenn benötigt.
 
Ui, schon so viele Antworten ^^

Wie Apollonius und Bernhard schon schrieben, suche ich einen Weg die Schreibrechte zu testen, also schon nach der "Ich fahre jetzt gegen einen Baum, nur um meinen Airbag zu testen."-Methode.
Überprüfen ob der Benutzer oder das Programm Adminrechte hat, hilft mir weniger weiter.

Was muss denn in der Manifest stehen, damit die Dateisystemvirtualisierung abgeschaltet wird? Oder reicht es einfach, wenn man irgendein Vista Manifest benutzt?

Danke!

MfG
Dimholz


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.
Seite 1 von 2  1 2      

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