Delphi 正在为管理员权限请求添加清单

Delphi 正在为管理员权限请求添加清单,delphi,delphi-7,manifest,administrator,Delphi,Delphi 7,Manifest,Administrator,我有一个将程序设置写入windows注册表的应用程序,这是绝对必要的。因此,存储到文件不是一个选项 为了简化这一点,我想给一个“管理员权限”的唠叨屏幕,而不是试图解释如何右键单击程序文件/快捷方式 我发现了一篇相当不错的文章,但在为清单添加了自己的资源文件后,我收到了一个重复的资源错误 这可能是由于与内部清单的冲突,为了解决这个问题,我看到很多评论建议在项目选项中禁用“启用运行时主题”。我浏览了每一个菜单,但找不到它,现在有人告诉我,它可能在Delphi7中不可用,并在以后的版本中引入 如何添加

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

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

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

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

如何添加自己的清单?

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

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

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

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


我已经说过“将程序设置写入注册表不是授予应用程序管理员权限的正当理由”。不过,在任何情况下都最好包含UAC清单。常见的
requestedExecutionLevel
应该是
level=“asInvoker”

创建以下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+XP主题)

uac_xp.manifest


通过“项目>添加到项目”菜单项将所需的
rc
文件(
uac.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
文件

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



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

在较新版本的Delphi中,不再需要此清单。
在“项目选项”和“应用程序”下,有一个清单部分:


东京10.2.1版截图

这将自动处理XP清单,该清单在的底部作为警告提到

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

将程序设置写入注册表不是授予应用程序管理员权限的正当理由!这是一个非常糟糕的主意。人们确实想知道为什么你不做其他开发人员都做的事情,并将程序设置写入正确的位置。我正在将它们写入Hkey current user,从我阅读的内容来看,它应该可以在没有管理员的情况下写入。写入HKCU不需要管理员权限。那么为什么你需要成为一个呢?您仍然需要包含UAC清单,但带有
level=“asInvoker”
,这可能不会改变dup资源的问题。正确。正如你可能知道的,这是我的第一次显式尝试。我选择admin的原因是因为我知道它是有效的。一旦我有了工作,我就可以专注于清单和不同的级别,并对其进行微调。在任何表单上都没有Xpmanifest组件或Xpman声明。这只是向应用程序添加清单的一种方法(我想说是Delphi 7中的常用方法)。因此,如果这没有帮助,请尝试像以前一样在整个项目中搜索所有包含的资源
{$R ResourceFileName.res}
。可以有一个,其中包括清单(资源文件的名称可以是任意的)。与使用ide在项目中添加资源相比,添加资源的方法似乎解决了这个问题。我听到了你关于管理的说法,但我现在可以使用设置来查看哪些是允许的,哪些是不允许的。@Redshift,关于你的编辑:注意
{$R'uac_xp.res''uac_xp.rc'}
。Delphi将自动将
rc
编译为
res
文件,因此无需通过
brcc32 uac.rc
编译
rc
文件。如果仅使用
{$R'uac_xp.res'}
则需要在Delphi IDE.FYI之外编译
rc
文件,在现代Delphi版本中,可以直接在项目选项中指定自定义.manifest文件的路径,而不是使用.rc/.res文件。请参阅“启用运行时主题”以“自定义清单”.对Embarcadero docwiki URL的轻微更正--您可以(今天)在此处查看有关Delphi XE7应用程序选项的信息:
1 24 "uac.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>
1 24 "uac_xp.manifest"
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.