【问题标题】:Adding manifest for admin rights request为管理员权限请求添加清单
【发布时间】:2013-01-20 02:42:54
【问题描述】:

我有一个应用程序可以将程序设置写入 Windows 注册表,这是绝对必要的,因此不能选择存储到文件中。

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

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

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

如何添加我自己的清单?

【问题讨论】:

  • 将程序设置写入注册表并不是授予应用程序管理员权限的正当理由!这是一个非常糟糕的主意。
  • 有人想知道为什么您不做其他开发人员所做的事情并将程序设置写入正确的位置。
  • 我正在将它们写给 Hkey 当前用户,根据我的阅读,它应该可以在没有管理员的情况下写入。
  • 写入 HKCU 不需要管理员权限。那么为什么需要成为一个呢?您仍然需要包含 UAC 清单,但使用 level="asInvoker" 这可能不会改变您的 dup 资源问题。
  • 正确。正如您可能知道的那样,这是我的第一次明显尝试。我选择管理员的原因是因为我知道它有效。一旦我有一些工作,我就可以专注于清单和不同的级别,并对其进行微调。

标签: delphi delphi-7 manifest administrator


【解决方案1】:

我已经评论说“将程序设置写入注册表并不是授予您的应用程序管理员权限的正当理由”。然而,在任何情况下都包含一个 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"

通过“项目 > 添加到项目”菜单项将所需的 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 会自动将rc 编译为res 文件。

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


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

【讨论】:

  • 与使用ide在项目中添加资源相比,您添加资源的方法似乎解决了问题。我听到您对管理员的看法,但我现在可以使用设置来查看允许和不允许的内容。
  • @Redshift,关于您的编辑:请注意{$R 'uac_xp.res' 'uac_xp.rc'}。 Delphi 会自动将rc 编译为res 文件,因此无需通过brcc32 uac.rc 编译rc 文件。如果你只使用{$R 'uac_xp.res'},那么你需要在Delphi IDE之外编译rc文件。
  • 仅供参考,在现代 Delphi 版本中,您可以直接在项目选项中指定自定义 .manifest 文件的路径,而不是使用 .rc/.res 文件。
  • 参见docwiki.embarcadero.com/RADStudio/XE7/en/…“启用运行时主题”到“自定义清单”。
  • 对 Embarcadero docwiki URL 稍作更正——您可以(今天)在这里查看有关 Delphi XE7 应用程序选项的信息:​​docwiki.embarcadero.com/RADStudio/XE7/en/Application_Options
【解决方案2】:

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

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

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

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

【讨论】:

  • 任何表单上都没有 Xpmanifest 组件或 Xpman 声明。
  • 这只是如何将清单添加到应用程序的一种方式(我想说的是 Delphi 7 中的常见方式)。因此,如果这没有帮助,请尝试像以前一样在整个项目中搜索所有包含的资源{$R ResourceFileName.res}。可以有一个,其中包括清单(资源文件的名称可以是任何名称)。
【解决方案3】:

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


东京 10.2.1 版截图

这会自动处理在Kobik's answer 底部作为警告提到的 XP 清单。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2014-02-08
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多