添加管理员权限请求的清单

问题描述 投票:7回答:3

我有一个应用程序将程序设置写入Windows注册表是绝对必要的。存储到文件不是一个选项。

为了简化这一点,我想提供一个“管理员权限”唠叨屏幕,而不是试图解释如何右键单击程序文件/捷径。

我找到了一篇相当不错的文章,但是在为清单添加自己的资源文件后,我收到了重复的资源错误。

这应该是由于与内部清单冲突并解决问题我看到很多评论建议在项目选项中禁用“启用运行时主题”。我已经浏览了所有菜单,但找不到它,我现在被告知它可能在Delphi 7中不可用并且在以后的版本中引入。

我如何添加自己的清单?

delphi delphi-7 manifest administrator
3个回答
1
投票

在较新版本的Delphi中,不再需要这样做。 在Project Options,然后是Application,有一个清单部分:

Manifest options 版本10.2.1 Tokyo的屏幕截图

这会自动处理在qazxsw poi底部提到的XP清单作为警告。

我不知道哪个Delphi版本可用。 (如果你知道,可以免费编辑这个答案)。 (编辑Ian Murphy 2019年2月:在XE2中没有)


23
投票

我已经评论过“将程序设置写入注册表并不是给予应用程序管理员权限的正当理由”。但是,在任何情况下都包含UAC清单是个好主意。常见的Kobik's answer应该是requestedExecutionLevellevel="asInvoker"

see the docs

创建以下4个文件(2套):


(仅限UAC)

uac.manifest

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

uac.rc

<?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 + XP主题)

uac_xp.manifest

1 24 "uac.manifest"

uac_xp.rc

<?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>

通过“项目>添加到项目”菜单项将所需的1 24 "uac_xp.manifest" 文件(rcuac.rc)添加到项目中。这将在您的项目文件中创建uac_xp.rc指令:

{$R}

注意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. 。 Delphi会自动将{$R 'uac_xp.res' 'uac_xp.rc'}编译为rc文件。

或者,您可以通过Delphi IDE外部的res编译rc文件。然后手动将brcc32 uac.rc添加到您的项目中。


确保您不使用任何其他XP清单。


11
投票

如何从Delphi 7项目中删除“内部”清单?

该内部清单在德尔福7次由{$R 'uac_xp.res'}组件表示,其唯一目的是将TXPManifest单元添加到表单单元的使用条款中。然后,这个XPMan.pas单元将包含清单本身的资源文件包含在项目输出中。

因此,要删除此内部清单,您需要从项目的所有形式中删除所有XPMan.pas组件(如果您使用它们),以及项目所有单元中的所有TXPManifest使用子句引用。

简而言之,对项目的所有单元执行以下两个步骤(如果未使用XPMan组件,则第一步是可选的,但第二步是可选的):

© www.soinside.com 2019 - 2024. All rights reserved.