Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   UAC Manifest Ersteller automatisch (https://www.delphipraxis.net/157408-uac-manifest-ersteller-automatisch.html)

WM_CLOSE 11. Jan 2011 09:17

UAC Manifest Ersteller automatisch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Gemeinde,
Ich habe hier ein Programm mit dessen Hilfe man das Standart-Manifest in ein Manifest mit UAC-Forderung umwandeln kann.
Es wandelt in der Manifest-Resource das "asInvoker" in "requireAdministrator" um und macht sonst keine Änderungen.
Es sollte aber auch kein Problem sein das Manifest komplett zu erzeugen wenn jmd Lust hat den Source zu ändern. Der wurde übrigens mit D2009 kompilliert.

Einfach die exe die das UAC-Fenster erhalten soll auf die ManifestCreator.exe ziehen.

Auch auf die Gefahr hin, dass es schon mehrere solche Programme gibt:
Viel Spass damit

himitsu 11. Jan 2011 10:29

AW: UAC Manifest Ersteller automatisch
 
Ich würde die EXE nicht einfach so als DLL laden und auch noch deren Startfunktion ausführen.
MSDN-Library durchsuchenLoadLibraryEx + LOAD_LIBRARY_AS_DATAFILE
(hab diesen Parameter noch nicht ausprobiert, aber wenn ich das richtig verstanden hab, dann sollte es so besser sein)

Die Fehlerbehandlung ist teilweise komplett falsch.

Und der Programmname ist nicht grade passend, denn du erstellst ja kein Manifest, sondern änderst es nur :zwinker:

ungetestet (nur so dahingetippt)
Delphi-Quellcode:
program ManifestCreator;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  AnsiStrings;

var
  hanFile   : hFile;
  hanExe    : HMODULE;
  hanRes    : HRSRC;
  hanLoadRes : HRSRC;
  ptrData   : Pointer;
  str       : AnsiString;

begin
  try
    if Length(ParamStr(1)) < 3 then
      raise EAbort.Create('Bitte geben Sie eine Datei an');
    WriteLn('Oeffne ', ParamStr(1), '...');
    hanExe := LoadLibraryEx(PChar(ParamStr(1)), nil, LOAD_LIBRARY_AS_DATAFILE);
    if hanExe <> 0 then RaiseLastOSError;
    hanRes := FindResource(hanExe, PChar(1), PChar(24));
    if hanRes = 0 then RaiseLastOSError;
    hanLoadRes := LoadResource(hanExe, hanRes);
    if hanLoadRes = 0 then RaiseLastOSError;
    ptrData := LockResource(hanLoadRes);
    if not Assigned(ptrData) then RaiseLastOSError;
    str := StringReplace(PAnsiChar(ptrData), 'asInvoker', 'requireAdministrator', [rfIgnoreCase]);
    UnlockResource(ptrData);
    FreeLibrary(hanExe);
    hanFile := BeginUpdateResource(PChar(ParamStr(1)), false);
    if hanFile = 0 then RaiseLastOSError;
    if not UpdateResourceA(hanFile, PChar(24), PChar(1), 1031, PAnsiChar(str), Length(str)) then
      RaiseLastOSError;
    if not EndUpdateResource(hanFile, False) then RaiseLastOSError;
    WriteLn('Fertig!');
    Sleep(3000);
  except
    on E:Exception do
    begin
      WriteLn(E.Classname, ': ', E.Message);
      Sleep(7000);
    end;
  end;
end.

WM_CLOSE 11. Jan 2011 10:45

AW: UAC Manifest Ersteller automatisch
 
Das mit LoadLibary war von Microsoft von deren HOWTO, und die Fehlerbehandlung habe ich auch nicht sonderlich getestet, bzw. nur geprüft, dass die wichtigsten Meldungen ("Modul / Resource nicht gefunden" usw funktionieren)

Danke für die Verbesserung.

PS: Das Programm habe ich seither nur mit von D2009 erstellten Anwendungen getestet

Zitat:

For example, the function can specify an .exe file to get a handle that can be used in FindResource or LoadResource.
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

himitsu 11. Jan 2011 12:40

AW: UAC Manifest Ersteller automatisch
 
Was du noch erwähnen köntest:
Theoretisch kann man damit alle Manifeste bearbeiten, wenn sie diese Kontensteuerung enthalten.

z.B. das Manifest von Delphi 7 enthält den entsprechenden Zweig nicht, weswegen man dieses dort nicht auf dieser Weise abändern kann.

pertzschc 11. Jan 2011 12:57

AW: UAC Manifest Ersteller automatisch
 
Zitat:

Zitat von WM_CLOSE (Beitrag 1073804)
Einfach die exe die das UAC-Fenster erhalten soll auf die ManifestCreator.exe ziehen.

Wie stellst Du Dir das denn vor? Wo ziehe ich den mein ProgrammIcon hin?

Gruß,
Christoph

himitsu 11. Jan 2011 13:05

AW: UAC Manifest Ersteller automatisch
 
Ich vermute mal, er meint "du ziehst die Datei über seine Exe im Explorer"

pertzschc 11. Jan 2011 13:08

AW: UAC Manifest Ersteller automatisch
 
Zitat:

Zitat von himitsu (Beitrag 1073840)
Ich vermute mal, er meint "du ziehst die Datei über seine Exe im Explorer"

Das funktioniert beim einem Consolen-Programm nicht. :(

DeddyH 11. Jan 2011 13:11

AW: UAC Manifest Ersteller automatisch
 
Wie kommst Du darauf?

Dezipaitor 11. Jan 2011 13:11

AW: UAC Manifest Ersteller automatisch
 
Wenn man das Manifest bei eine signierten Binärdatei ändert, wird die Signatur sowie ein eventuell vorhandene Prüfsumme ungültig und es kann passieren, dass das Programm sich nicht mehr starten lässt. Diesen Umstand sieht man oftmals bei Setupprogrammen oder Programmen, die sich über das Internet aktualisieren lassen und daher die heruntergeladenen Daten prüfen.

Also ich empfehle dringend eine Sicherheitskopie vorher anzulegen!

pertzschc 11. Jan 2011 13:27

AW: UAC Manifest Ersteller automatisch
 
Zitat:

Zitat von DeddyH (Beitrag 1073844)
Wie kommst Du darauf?

Zieh doch mal eine beliebige Programm-Exe aus dem Programmverzeichnis auf die ManifestCreator-Exe in deren Verzeichnis. Mein Explorer möchte dann das 1. Programm dorthin kopieren/verschieben/verlinken. Aber nicht die ManifestCreator-Exe starten.
Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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