Search code examples
delphims-accessdelphi-xe2elevated-privileges

How to grant elevation with Delphi


I have written a database app that imports data from an excel file into a Access database.

I have never had trouble to run the app, to insert records into the database, but as soon as I run the function to import data from the Excel into the Access I get the following warning:

The requested operation requires elevation - by die code:

LAccess := CreateOleObject('Access.Application');

What is causing this and is there a way to get around it


Solution

  • The CreateOleObject delphi function internally calls the CoCreateInstance WinApi method which requires elevation. you have a couple of options to deal with this.

    1) Adding a manifest to your app including the requested execution level requireAdministrator.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        name="Your app name goes here"
        processorArchitecture="x86"
        version="5.1.0.0"
        type="win32"/>
    <description>your app description goes here</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
               type="win32"
               name="Microsoft.Windows.Common-Controls"
               version="6.0.0.0"
               processorArchitecture="x86"
               publicKeyToken="6595b64144ccf1df"
               language="*"
            />
         </dependentAssembly>
      </dependency>
       <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
          <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="requireAdministrator"
              uiAccess="false"/>
          </requestedPrivileges>
        </security>
       </trustInfo>
    </assembly>
    

    2) You can launch a secondary process elevated that would do the task or create a COM object that runs elevated, you can find more info in these MSDN entries