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

时间:2013-02-05 08:26:22

标签: delphi delphi-7 manifest administrator

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

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

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

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

如何添加自己的清单?

3 个答案:

答案 0 :(得分:23)

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

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

创建以下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>

<强> uac.rc

1 24 "uac.manifest"

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

uac_xp.rc

1 24 "uac_xp.manifest"

通过“项目&gt;添加到项目”菜单项将所需的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.

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

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


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

答案 1 :(得分:11)

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

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

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

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

enter image description here

答案 2 :(得分:0)

在较新版本的Delphi中,不再需要这样做 在项目选项下,然后是应用程序,清单中有一个部分:

Manifest options
版本10.2.1 Tokyo

的屏幕截图

这会自动处理在Kobik's answer的botom中提到的XP清单。

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