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

Cli*_*ton 9 delphi administrator manifest delphi-7

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

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

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

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

我如何添加自己的清单?

kob*_*bik 23

我已经评论过"将程序设置写入注册表并不是给予应用程序管理员权限的正当理由".但是,在任何情况下都包含UAC清单是个好主意.共同requestedExecutionLevel应该是level="asInvoker".看文档

"Q: Adding manifest for admin rights request for delphi 7"
Run Code Online (Sandbox Code Playgroud)

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


(仅限UAC)

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>
Run Code Online (Sandbox Code Playgroud)

uac.rc

1 24 "uac.manifest"
Run Code Online (Sandbox Code Playgroud)

(UAC + XP主题)

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>
Run Code Online (Sandbox Code Playgroud)

uac_xp.rc

1 24 "uac_xp.manifest"
Run Code Online (Sandbox Code Playgroud)

通过"项目>添加到项目"菜单项将所需的rc文件(uac.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.
Run Code Online (Sandbox Code Playgroud)

请注意{$R 'uac_xp.res' 'uac_xp.rc'}.Delphi将自动编译rcres文件.

或者,您可以rc通过brcc32 uac.rc外部Delphi IDE 编译该文件.然后{$R 'uac_xp.res'}手动添加到您的项目.


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

  • @Redshift,关于你的编辑:注意`{$ R'uac_xp.res''uac_xp.rc'}`.Delphi会自动编译`rc`到`res`文件,所以不需要通过`brcc32 uac.rc`编译`rc`文件.如果你只使用`{$ R'uac_xp.res'}`那么你需要在Delphi IDE之外编译`rc`文件. (2认同)

TLa*_*ama 12

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

内部清单在Delphi中有7次由该TXPManifest组件表示,其唯一目的是将该XPMan.pas单元添加到表单单元的uses子句中.XPMan.pas然后,该单元将包含清单本身的资源文件包含在项目输出中.

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

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

在此输入图像描述


Jan*_*gen 6

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

清单选项
东京 10.2.1 版本的屏幕截图

在此输入图像描述 亚历山大 11.1.3 版本的截图

这会自动处理Kobik 答案底部作为警告提到的 XP 清单。

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