1

In Windows 7 x64 SP1, I get this error:

EInOutError: Cannot create file "C:\Users\Public\Desktop\test.txt". Access denied.

...when I run the following program:

program TestConsoleApplication;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.IOUtils,
  System.Classes,
  System.SysUtils;

begin
  try
    System.IOUtils.TFile.WriteAllText('C:\Users\Public\Desktop\test.txt', 'test');
  except
    on E: Exception do
    begin
      Writeln(E.ClassName, ': ', E.Message);
      Readln;
    end;
  end;
end.

How can I automatically get a UAC prompt instead? Like in Windows Explorer I also automatically get a UAC prompt when trying to copy a file to C:\Users\Public\Desktop, for example.

EDIT: I have now extracted the Manifest resource from an app built in Delphi 10.2:

<?xml version="1.0" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
        </dependentAssembly>
    </dependency>
    <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>
            <!--The ID below indicates app support for Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <!--The ID below indicates app support for Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!--The ID below indicates app support for Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!--The ID below indicates app support for Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!--The ID below indicates app support for Windows 10 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        </application>
    </compatibility>
</assembly>

Can I use this manifest file as a custom manifest file in Delphi 10.1?

What does the expression uiAccess="false" in the Manifest mean?

user1580348
  • 5,721
  • 4
  • 43
  • 105
  • 1
    See [Delphi: Prompt for UAC elevation when needed](https://stackoverflow.com/a/923379/576719) – LU RD May 14 '18 at 08:59
  • Go to your project options screen. Click on the Application item. Select a Windows platform configuration as appropriate. You should have a Manifest File item: select Require Administrator from the Execution Level combo box. Then rebuild your application. – Pat Heuvel May 14 '18 at 09:19
  • @PatHeuvel In Delphi 10.1 I don't have an "Execution Level combo box". This is a screenshot: https://i.imgur.com/Mp2S54M.png – user1580348 May 14 '18 at 09:36
  • Windows Explorer implements this by detecting that elevation is required and starting a new process to do that. Likely using the COM elevation moniker. – David Heffernan May 14 '18 at 09:39
  • @PatHeuvel I have done so in Delphi 10.2. But this implies answering the UAC prompt everytime I start the application which is impractical. If there is no other possibility then I will have to follow David's advice. – user1580348 May 14 '18 at 13:27
  • You could go to Control Panel/User Accounts and turn UAC off. – Pat Heuvel May 15 '18 at 02:27
  • With regard to your 10.1 problem, "Enable Administrator Privileges" should do the same thing. – Pat Heuvel May 15 '18 at 02:31

0 Answers0