Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi [Vista / UAC] Programm mit Adminrechten starten (https://www.delphipraxis.net/110066-%5Bvista-uac%5D-programm-mit-adminrechten-starten.html)

TheMiller 12. Mär 2008 13:26


[Vista / UAC] Programm mit Adminrechten starten
 
Hallo,

in letzter Zeit musste ich oft in Programme das Vista-Manifest einbinden, welches dem Endbenutzer erlaubt, das Programm mit Adminrechten zu starten (evtl. Update-Programm o.ä).

Nun gibt es hier in der DP einige Einträge zu diesem Thema, aber immernoch manchmal Probleme. Nun versuche ich euch eine Lösung näher zu bringen und auf einen oft gemachten Fehler einzugehen, der wohl bei dem Einen oder Anderen, aus Flüchtigkeit passiert (siehe Punkt 4).


Übersicht
====================

1. Manifest erstellen
2. Manifest als Resource erstellen
3. Projekt mit Manifest compilieren
4. Wenn das Manifest "nicht funktioniert"
5. Schlusswort



1. Manifest erstellen

Eine Manifest-Datei besteht aus einer XML-Struktur, die unter dem Namen <Programmname>.exe.manifest gespeichert wird. Der Inhalt der Manifest-Datei ist - je nach Bedarf - verschieden. Hier verwende ich ein Standard-Manifest, welches Vista sagt, dass das Programm nur mit Administrationsrechten gestartet werden darf. Dies ist beispielsweise bei Update-Programmen notwendig.

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="VistaLogonCustomizer.exe" type="*"/>
  <description>elevate execution level</description>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges>
      <requestedExecutionLevel level="requireAdministrator"/>
     </requestedPrivileges>
   </security>
  </trustInfo>
  <dependency>
   <dependentAssembly>
     <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
   </dependentAssembly>
  </dependency>
</assembly>
Die Schlüsselstelle (für unsere Zwecke) stellt folgender Knoten aus dem Manifest dar:

Code:
<requestedPrivileges>
 <requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
Mit RequestedExecutionLevel können wir der UAC sagen, welche Rechte wir brauchen. Hier steht als Level "requireAdministrator". Neben diesem gibt es noch zwei andere Level - und zwar "asInvoker" sowie "highestAvailable".

requireAdministrator ist das höchste Level, welches man anfordern kann. Es sagt, dass das Programm nur mit Admin-Rechten ausgeführt werden darf. Bekommt es diese nicht, wird das Programm nicht gestartet.

highestAvailable ist das nächst kleinere Level. Es fragt nach Adminrechten, bekommt es diese nicht, wird das Programm mit den Standard-Userrechten ausgeführt.

asInvoker bezeichnet das kleinste Level. Das Programm wird mit den Rechten gestartet, die der Prozess der das Programm starten will, hat. Also wenn ein Programm, welches Admin-Rechte hat, ein neues Programm mit dem Level (asInvoker) startet, bekommt es auch Admin-Rechte.

Hinweis: CodeGear weist darauf hin, dass ein fehlerhaft formatiertes Manifest bei Windows XP einen BlueScreen erzeugen kann.

Ich kenne jetzt auch nicht alle Manifeste (?), aber ich habe bisher bei dem oben abgedruckten noch keine Probleme feststellen können.

Nun erstellt im Quellcodeverzeichnis des Projekts eine neue Textdatei, in die ihr das Manifest einfügt und speichert die Datei unter dem Namen <Programmname>.exe.manifest.


2. Manifest in die Exe einbinden

Als nächstes werden wir aus dem erstellten Manifest eine Resource erstellen, damit es direkt in das Programm einkompiliert werden kann. Man könnte das Manifest auch als externe Datei mitliefern, aber diese Variante ist eher unschön.

Also erstellen wir eine weitere Datei im gleichen Verzeichnis mit dem Namen <Programmname>.rc. Diese Datei sollte folgenden Inhalt haben:

Zitat:

1 24 "<programmname>.exe.manifest"
Die "1" bezeichnet den Index der Resource, die "24" den Type der Resource. Die RC-Datei stellt für den Resource-Builder von Delphi sozusagen die "Compileranweisung" für die Erstellung der Resource dar. Da wir die RC-Datei erstellt und gespeichert haben, werden wir jetzt die Resource auch erstellen.

Also, ab in die Kommandozeile (Start -> Ausführen -> cmd)

Zitat:

brcc32 -v <programmname>.rc -fo<programmname>.res
-v bedeutet, dass alle Ausgaben, die der Compiler erstellt, nicht unterdrückt, sondern dem Benutzer ausgegeben werden.
-fo<programmname> gibt den Dateinamen an, unter dem die Resource erstellt wird.

Nach der Ausführung sollte eine solche Ausgabe auf der Konsole erscheinen:

Zitat:

Zitat von cmd
Borland Resource Compiler Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.

Lines: Current 0, Total 0
New File: Project1.rc
Lines: Current 1, Total 0
New File: C:\Users\<benutzer>\Desktop\manifest\Project1.exe
Lines: Current 0, Total 0
New File: C:\Users\<benutzer>\Desktop\manifest\Project1.res
Lines: Current 1, Total 1
Compiling 24:1

C:\Users\<benutzer>\Desktop\manifest>



3. Projekt mit Manifest compilieren

Nun haben wir eine schöne Resource, die wir in das Projekt einbinden können. Unter der bestehenden Einbindung der DFM-Datei, schreiben wir unsere Manifest-Resource hin:

Delphi-Quellcode:
{$R *.dfm}
{$R manifest.res}
Wenn das Programm jetzt erstellt wird, wird das Manifest mit eingebunden. Beim nächsten Start des Programms sollte die UAC aufgerufen werden, falls nicht, lest den folgenden Punkt!


4. Wenn das Manifest "nicht funktioniert"

Ist das Manifest nach den oberen Schritten eingebunden worden und die UAC wird NICHT geladen, ist die Hauptursache das Vorhandensein des Windows-XP-Manifests - WindowsXP und WindowsVista Manifests dürfen nicht kombiniert werden! Es ist vielmehr so, dass das Vista-Manifest alles Erforderliche des WindowsXP-Manifests enthält und die Vista-spezifischen Anweisungen von Windows XP ignoriert werden.

Also auf allen Formularen die XP-Man Komponente entfernen UND aus allen Units des Projekts die dazugehörige Unit XPMan entfernen. Danach das Projekt neu kompilieren und dann sollte es funktionieren!


5. Schlusswort

Ich hoffe, ich konnte euch bei der Anforderung von Adminrechten unter Windows Vista helfen. Es gibt zwar noch andere Methoden innerhalb der Manifest-Datei um Adminrechte anzufordern, aber das sollte erstmal genügen. Allerdings sollte nicht jedes Projekt, was ihr in Zukunft erstellt, dieses Manifest benutzen, dess es fordert immer Admin-Rechte an und kann nicht ohne Admin-Rechte starten!

Feedback ist natürlich gerne erwünscht, sowohl positives als auch negatives. Doch bedenkt - es war mein erstes Mal :wink:

Grüße!

Bernhard Geyer 12. Mär 2008 13:33

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Zitat:

Zitat von DJ-SPM
Hinweis: CodeGear weist darauf hin, dass ein fehlerhaft formatiertes Manifest bei Windows XP einen BlueScreen erzeugen kann.

Ich kenne jetzt auch nicht alle Manifeste (?), aber ich habe bisher bei dem oben abgedruckten noch keine Probleme feststellen können.

Tritt AFAIK nur bei XP ohne SP (1)/2 auf, da hier der Exe-Loader von XP aus dem Tritt kommt (vermutlich wegen der Exception des XML-Parsers beim analysieren des Manifests).

TheMiller 12. Mär 2008 13:36

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Das kann sein. Das hört sich auch logisch an. Aber davon habe ich keine Ahnung - muss ich gestehen :wink:

Luckie 12. Mär 2008 13:41

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Das wichtigste hast du vergessen oder ausgelassen:
XML-Code:
<requestedPrivileges>
  <requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
Und zwar was man hier an Privilegien angeben kann und was sie bewirken. Bzw. du hast gar nicht erklärt, dass genau diese Zeile dafür verantwortlich ist, dass das zugehörige Programm als Administrator gestartet wird.

devidespe 12. Mär 2008 13:48

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Nicht schlecht, aber noch ausbaufähig. Vielleicht solltest Du ein richtiges Tutorial draus machen.

Am Anfang beschreibst Du, dass man einen oft gemachten Fehler umgehen soll, definierst aber nicht die Stelle im Text, wo das beschrieben wird.

RavenIV 12. Mär 2008 15:23

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Zitat:

Zitat von devidespe
Nicht schlecht, aber noch ausbaufähig. Vielleicht solltest Du ein richtiges Tutorial draus machen.

Vielleicht auch als pdf zum runterladen.

TurboMartin 12. Mär 2008 15:32

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Ab Delphi Commodore musst du auch noch processorArchitecture erklären, wenn die 64bit-Unterstützung vorhanden ist.

RWarnecke 12. Mär 2008 16:51

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Aus diesem Link solltest Du vielleicht noch das Ergebnis mit in Dein Tutorial einfügen. Denn das Ergebnis erlaubt ein Manifest, welches für Windows XP, Windows XP SP1, Windows XP SP2 und Windows VISTA funktioniert.

haentschman 12. Apr 2008 07:59

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Guten Morgen...

ich habe mich an das Tutorial gehalten und erhalte beim Compilieren folgenden Fehler
Zitat:

[DCC Fehler] E2161 Warning: Duplicate resource: Type 14 (ICON GROUP), ID MAINICON; File D:\XXX\eAV.RES resource kept; file eAv.res resource discarded.
[DCC Fehler] E2161 Warning: Duplicate resource: Type 16 (VERSIONINFO), ID 1; File D:\XXX\eAV.RES resource kept; file eAv.res resource discarded.
könnte mir bitte jemand das erklären ?
die Compileranweisung:
Delphi-Quellcode:
{$R *.DFM}
{$R eAV.res}
das Manifest:
Zitat:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="VistaLogonCustomizer.exe" type="*"/>
<description>elevate execution level</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
</dependentAssembly>
</dependency>
</assembly>
PS: XPMan auch aus uses entfernt.

Danke

haentschman 12. Apr 2008 09:57

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Hallo...

vieleicht sollte ich erst mal wach werden... :oops:

ich habe dümmlicherweise den gleichen Namen benutzt den Delphi als .res für das Projekt anlegt :wall:

Name geändert...alles i.O.

:duck:

haentschman 12. Apr 2008 10:44

Re: [Vista / UAC] Programm mit Adminrechten starten
 
ist dann doch noch nicht vorbei... :shock:

in meinem Projekt habe ich 2 EXE, welche das Vista Manifest bekommen sollen.

1. EXE eAV wie oben beschrieben funktioniert.
2. EXE Update Fehler
Zitat:

[DCC Fehler] E2161 Warning: Duplicate resource: Type 24 (user-defined), ID 1; File eAVVista.res resource kept; file eAVVista.res resource discarded.
- Themes zur Laufzeit deaktiviert
- XPMan nicht vorhanden
- Update.res gelöscht und neu erstellen lassen
- seperate res für Update gemacht eAVVistaU.res Fehler der gleiche mit eAVVistaU.res im Text.

:gruebel:

bitte helft mir auf die Sprünge... Danke

PS: google liefert zu "E2161 type 24" nicht besonders viel :(

Luckie 12. Apr 2008 11:31

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Du hast zweimal die Ressource mit der ID oder dem Typ 24 deklariert. Ob Typ oder ID, da bin ich mir nicht so ganz sicher.

haentschman 12. Apr 2008 11:41

Re: [Vista / UAC] Programm mit Adminrechten starten
 
nun ja... soweit kann ich folgen. Ich wüßte nur gern wo ? :gruebel:

- im Programm Update steht nur Standard {$R *.DFM}
- im Programm eAV steht {$R *.DFM} und {$R eAVVista.res}
:?: da die Quelltexte beider EXE und die Resourcedatei in einem Projektverzeichnis stehen könnte es möglich sein, daß die Recorcedatei automatisch mitcompiliert wird durch {$R *.RES} im Quelltext der Projektdatei und ich das dadurch doppelt habe ?

MCXSC 26. Jan 2009 01:21

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Wenn ich die RES einbinde, und dann das Programm compiliere/starte (also über F9), hängt sich Delphi bei dem eigentlichen Programmstart auf ("Keine Rückmeldung") - wenn ich nur compiliere (über STRG+F9) funktioniert alles wie es soll und nichts hängt sich auf. Jemand eine Idee?

ak-ac 10. Apr 2009 11:41

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Habt ihr mal versucht das Laufzeit-Thema des Projektes zu deaktivieren? Ich glaube D2009 erstellt darüber auch ein eigenes Manifest und bindet das automatisch ein.

himitsu 10. Apr 2009 11:44

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Zitat:

Zitat von ak-ac
Ich glaube D2009 erstellt darüber auch ein eigenes Manifest und bindet das automatisch ein.

jupp, es bindet standardmäßig ein eigenes XP-Manifest ein.

mkinzler 10. Apr 2009 11:45

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Welches man über die Projekteinstellungen konfigurieren kann

ak-ac 10. Apr 2009 12:08

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Zitat:

Zitat von mkinzler
Welches man über die Projekteinstellungen konfigurieren kann

eheisst das, ich kann mir die vista-manifeste sparen und dort den UAV-Level direkt auswählen?

mkinzler 10. Apr 2009 12:15

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Bisher leider nicht. Man kann aber die Verwendung der Themes an und abschalten
Eigene Ressourcen kann man auch direkt einbinden

ak-ac 10. Apr 2009 12:25

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Zitat:

Zitat von mkinzler
Bisher leider nicht. Man kann aber die Verwendung der Themes an und abschalten
Eigene Ressourcen kann man auch direkt einbinden

ah danke! dann habe ich's ja richtig gemacht, und dass dann über entsprechende manifest dateien eingebudnen. die sind schwerer zu finden als man denk ;o) - aber der beitrag hat mir sehr weitergeholfen! werde jetzt noch die elevationroutine einbinden und dann läuft es bei mir endlich...

GPRSNerd 14. Jul 2009 12:18

Re: [Vista / UAC] Programm mit Adminrechten starten
 
Hi,

Danke für das gute Tutorial und die hilfreichen Anmerkungen im Thread.

Ich starte jetzt zum Setzen von Kontextmenu-Einträgen im Explorer [liegen unter HKEY_CLASSES_ROOT] eine Helper-Applikation mit dem Manifest zur Anfrage von Admin-Rechten.
Funktioniert unter Windows 7 RC einwandfrei.

Danke,
Stefan

Micha88 22. Feb 2011 18:13

AW: [Vista / UAC] Programm mit Adminrechten starten
 
ich habe alles genau so gemacht. Unter Windows 7 Home Premium funktioniertes nicht.

soundmaun 25. Feb 2012 14:41

AW: [Vista / UAC] Programm mit Adminrechten starten
 
:-D Haut hin! THX!

Andreas Schilling 2. Jul 2013 15:06

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Windows 7 Prof., Delphi 2007

Also bei mir will es einfach nicht funktionieren. Die erzeugte .res-Datei wird eingebunden (erkennt man daran, das das Programm-Icon weg ist).

Hier der Inhalt der res-datei
Delphi-Quellcode:
        ÿÿ  ÿÿ                  ]     ÿÿ ÿÿ     0         <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="Update"
    version="1.0.0.2"
    processorArchitecture="*"/>
  <dependency>
     <dependentAssembly>
        <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          publicKeyToken="6595b64144ccf1df"
          language="*"
          processorArchitecture="*"/>
      </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>
Wenn ich das Programm als User mit Adminrechten starte kann ich machen was ich will (in INI Schreiben usw.). Wenn ich als eingeschränkter User (nur Lokaler User) arbeite kommt beim Start keine Abfrage von der UAC (obwohl ich die höchste Stufe eingestellt habe) und das Programm macht dann nichts von dem was es machen soll (z.B. Speichern von Dateien im Ordner C:\progam files (x86)\...). Ist die res-datei noch nicht das was sie sein soll? Oben steht man soll die res-Datei hinter
Delphi-Quellcode:
{$R *.dfm}
ins Projekt einbinden. Aber in der *.dpr gibt es den Eintrag nicht, nur auf dem Formular.

Gruß Andreas

WM_CLOSE 2. Jul 2013 16:12

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Es sieht so aus, als ob du das Dokument als ANSI gespeichert hast, aber im xml ist encoding=utf-8 angegeben.
Vielleicht mal einen anderen Editor benutzen? [GOOGLE]Notepad++[/GOOGLE].

Andreas Schilling 3. Jul 2013 07:46

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Nach dem Speichern mit Notepad sieht der Inhalt der res-datei zwar nicht anders aus, aber nach dem Compilieren hat die Exe dieses nette Sicherheitssymbol und es kommt jetzt die Anforderung der Adminrechte. Das Krönung des ganzen wäre jetzt noch wenn ich wieder mein Programmicon rein bekäme und die Versionsnummer ....

Gruß Andreas

jaenicke 3. Jul 2013 09:23

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Wenn dein Programmicon weg ist, sieht wahrscheinlich die .rc Datei zur Erzeugung der .res falsch aus. Hintergrund ist dann vermutlich, dass die Ressourcen-ID des Mainicons evtl. überschrieben wurde. Auch darf kein Ressourcenname (zumindest kein Icon) alphabetisch vor MAINICON kommen.

Oder du hast die .res Datei im gleichen Ordner liegen wie das Projekt, so dass Delphi die vor deinem Icon einbindet. (Die sollte immer in einem Unterordner liegen.)

Oder du hast die Einbindung der originalen .res aus Versehen entfernt.

Andreas Schilling 3. Jul 2013 11:06

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Die Einbindung der originalen res habe ich nicht ausversehen sondern mit Absicht entfernt. Da in keinem Beispiel das ich zu dem Thema gefunden hatte zwei Ressourcen standen, habe ich angenommen, das nur eine gehen kann und das Original auskommentiert. Nun habe ich beide drinnen und "fast" alles ist OK. Wenn ich jetzt aus der Entwicklungsumgebung heraus das Programm starten will kommt die Fehlermeldung "Vorgang kann nicht erzeugt werden". Kompilieren und dann im Explorer die EXE starten geht aber.

Gruß Andreas

Edit: Die Fehlermeldung hat aber wahrscheinlich nichts mit der Res-datei zu tun. Auch nach dem Auskommentieren der Zeile kommt die Fehlermeldung.

jaenicke 3. Jul 2013 14:22

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Die originale .res enthält das Icon und die Versionsinformationen, zudem noch diverse Standardicons für Buttons usw.

Zitat:

Zitat von Andreas Schilling (Beitrag 1220563)
Wenn ich jetzt aus der Entwicklungsumgebung heraus das Programm starten will kommt die Fehlermeldung "Vorgang kann nicht erzeugt werden".

Das liegt am Start als Admin. Einen Admin-Prozess kann man nur als Admin debuggen. Willst du also das Programm mit dem Debugger starten, musst du Delphi als Admin starten.

Andreas Schilling 3. Jul 2013 15:06

AW: [Vista / UAC] Programm mit Adminrechten starten
 
Ja das habe ich mittlerweile auch heraus bekommen nachdem ich nach der Meldung gegoogelt hatte.

Gruß Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.

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