修改存储为Resource Delphi的UAC清单文件

时间:2014-07-06 08:54:14

标签: delphi resources manifest uac

我希望我的程序在启动时简单地请求提升权限,为此,我将一个Manifest文件作为资源添加到Delphi源代码中。这是XML文件内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.1.1.1"
      processorArchitecture="X86"
      name="YourApplicationExeName"
      type="win32"/>
    <description>elevate execution level</description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

我需要修改文件所在的位置&#34; YourApplicationExeName&#34;并添加当前的.exe名称,因为用户可以随时重命名.exe文件。

我想知道的是:当用户打开可执行文件时,如何将可执行文件的新文件名添加到作为资源存储的清单文件中?我知道如何获取新文件名,我只想知道如何使用新文件名更新资源文件?

2 个答案:

答案 0 :(得分:1)

你要求的是不可能的。进程从可执行文件开始。该进程正在执行时被锁定,无法修改。

如果您希望修改已编译的可执行文件中的资源,则使用UpdateResource API。但是不能锁定文件才能这样做。您需要从不同的过程中执行此操作。

我认为无论如何你都在过度分析。您希望修改的字段不应包含可执行文件的文件名。毕竟,文件名可以更改。此字段具有应用程序的名称,该值与可执行文件的文件名无关。

documentation描述了这个字段:

  

以应用程序或程序集的唯一名称命名。使用以下格式作为名称:Organization.Division.Name。例如Microsoft.Windows.mysampleApp。

总而言之,我认为你被写过YourApplicationExeName的人误导了。在编译程序之后,您根本不应该尝试修改此资源。您应该在编译应用程序时正确设置字段,就是这样。

答案 1 :(得分:0)

告诉Delphi不要在可执行文件中包含汇编清单,而是要有一个外部清单。

例如:

Contoso.exe
Contoso.exe.manifest

.manifest文件只是一个XML文件。当用户将Contoso.exe重命名为Frobber.exe时,您可以:

  • 告诉他们也将Contoso.exe.manifest重命名为Frobber.exe.manifest
  • 在启动Frobber.exe.manifest
  • 之前,将Frobber.exe文件呕吐到硬盘上