Adding manifest for admin rights request

Clinton picture Clinton · Feb 5, 2013 · Viewed 24.6k times · Source

I have an application that writes program settings to the windows registry that is absolutely necessary so.storing to a file is not an option.

To simplify this, I would like to give an "admin privileges" nag screen instead of trying to explain how to right click on the program file/short cut.

I found a reasonably good article but I receive a duplicate resource error after adding my own resource file for the manifest.

This is supposedly due to a conflict with the internal manifest and to resolve the issue I see a lot of comments suggesting "enable runtime themes" to be disabled in project options. I have gone through every menu but cannot find it and I've now been told that it may not be available in Delphi 7 and was introduced in later versions.

How can I add my own manifest?

Answer

kobik picture kobik · Feb 5, 2013

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.