AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi [Vista / UAC] Programm mit Adminrechten starten

[Vista / UAC] Programm mit Adminrechten starten

Ein Tutorial von TheMiller · begonnen am 12. Mär 2008 · letzter Beitrag vom 3. Jul 2013
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von TheMiller
TheMiller
Registriert seit: 19. Mai 2003
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 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

Grüße!
 
Benutzerbild von Bernhard Geyer
Bernhard Geyer

 
Delphi 10.4 Sydney
 
#2
  Alt 12. Mär 2008, 14:33
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).
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

 
Delphi XE7 Architect
 
#3
  Alt 12. Mär 2008, 14:36
Das kann sein. Das hört sich auch logisch an. Aber davon habe ich keine Ahnung - muss ich gestehen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#4
  Alt 12. Mär 2008, 14:41
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.
Michael
  Mit Zitat antworten Zitat
devidespe

 
Delphi 10.4 Sydney
 
#5
  Alt 12. Mär 2008, 14:48
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.
Devid
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

 
Delphi 2007 Enterprise
 
#6
  Alt 12. Mär 2008, 16:23
Zitat von devidespe:
Nicht schlecht, aber noch ausbaufähig. Vielleicht solltest Du ein richtiges Tutorial draus machen.
Vielleicht auch als pdf zum runterladen.
Klaus E.
  Mit Zitat antworten Zitat
TurboMartin

 
Turbo Delphi für Win32
 
#7
  Alt 12. Mär 2008, 16:32
Ab Delphi Commodore musst du auch noch processorArchitecture erklären, wenn die 64bit-Unterstützung vorhanden ist.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

 
Delphi XE8 Enterprise
 
#8
  Alt 12. Mär 2008, 17:51
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.
Rolf Warnecke
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

 
Delphi 12 Athens
 
#9
  Alt 12. Apr 2008, 08:59
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

 
Delphi 12 Athens
 
#10
  Alt 12. Apr 2008, 10:57
Hallo...

vieleicht sollte ich erst mal wach werden...

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

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

  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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