Adding manifest for admin rights request

試著忘記壹切 提交于 2019-11-28 18:29:29
Jan Doggen

In newer versions of Delphi this is no longer necessary.
Under Project Options, then Application, there is a section for the manifest:


Screenshot from version 10.2.1 Tokyo

This automatically takes care of the XP manifest mentioned as a warning at the botom of Kobik's answer.

I do not know from which Delphi version this was available.
(Free free to edit this answer if you know). (Edit Ian Murphy Feb 2019: It is not available in XE2)

I already commented that "Writing program settings to the registry is not a proper cause to give your application admin privileges". However it is a good idea to include a UAC manifest in any case. the common requestedExecutionLevel should be level="asInvoker". see the docs

"Q: Adding manifest for admin rights request for delphi 7"

Create the below 4 files (2 sets):


(UAC Only)

uac.manifest

<?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="MyApp" type="win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

uac.rc

1 24 "uac.manifest"

(UAC + XP Themes)

uac_xp.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="MyApp" version="1.0.0.0" processorArchitecture="x86"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <!-- Windows Vista application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--Windows 7-->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!--Windows Vista-->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
    </application>
  </compatibility>   
</assembly>

uac_xp.rc

1 24 "uac_xp.manifest"

Add the desired rc file (uac.rc or uac_xp.rc) to your project via the "Project > Add to project" menu item. This will create the {$R} directive in your project file:

program Project1;

{.$R 'uac.res' 'uac.rc'} // UAC only
// OR
{$R 'uac_xp.res' 'uac_xp.rc'} // UAC + XP Themes

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Note the {$R 'uac_xp.res' 'uac_xp.rc'}. Delphi will auto compile the rc to res file.

Alternatively you can compile the rc file via brcc32 uac.rc outside Delphi IDE. and then add {$R 'uac_xp.res'} manually to your project.


Make sure you don't use any other XP manifest.

How to remove the "internal" manifest from Delphi 7 project ?

That internal manifest was in Delphi 7 times represented by the TXPManifest component, whose only purpose was to add the XPMan.pas unit to the uses clause of a form's unit where it was dropped. This XPMan.pas unit then included the resource file with the manifest itself into a project output.

So, to remove this internal manifest, you need to remove all TXPManifest components from all of the forms of your project (if you used them), as well as all the XPMan uses clause references from all units of your project.

In short, do the following two steps for all units of your project (the first step is optional if you didn't used the TXPManifest components, but the second):

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!