【问题标题】:How to set adminstrator privilege using manifest for Windows 10?如何使用 Windows 10 的清单设置管理员权限?
【发布时间】:2015-09-08 10:22:17
【问题描述】:

我在 Delphi XE for Windows 10 上开发软件,我必须在 10 上以管理员权限运行我的软件。如果我右键单击 exe 文件并以管理员身份运行它,它不会引发任何错误,但如果我以任何其他方式运行它,程序会引发错误消息Access Denied。因此,它需要具有管理员身份。最初我认为您可以使用任务调度程序来完成此任务,但它也存在问题。现在,我正在学习我需要有自定义清单才能在 Windows 10 上执行此操作。因此,在在线浏览了一些 stackoveflow 问题、博客和网站之后,我为我的程序创建了一个清单,如下所示,但是当我运行我的程序时它仍然会引发Access Denied 错误信息。

这就是我所做的:

使用 NOTEPAD 创建了清单文件 (GeoMonitor.manifest):

<?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="*"
name="GeoMonitor"
type="win32" />
<description>elevate execution level</description>
<dependency>
<dependentAssembly>
<assemblyIdentity>
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustinfo xmlns="urn:schemas-microsoft-com:asm.v2"><security>
<requestedPrivileges>
<requestedExecutionlevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustinfo>
</assembly>

使用 NOTEPAD 创建 RC 文件 GeoMonitor.rc

1 24 GeoMonitor.manifest

在我取消选中项目选项中的选项Enable Run Time Theme 后,将这两个文件链接到我的项目文件。

最后我编译我的项目文件没有问题,然后在 Windows 10 上测试编译的 exe 文件。它仍然以用户而不是管理员身份运行。我做错了什么?

更新: 我需要在我的项目选项 - 资源编译器部分中设置什么吗?

【问题讨论】:

  • 你是如何“链接这两个文件”的?你看过second answer to this question,包括cmets吗?
  • @KenWhite 我实际上是通过右键单击项目名称并单击弹出菜单中的添加选项将这些文件添加到我的程序项目文件中。另外,我注意到 RC 文件已链接到我的 DPR 文件,就像 {.$R 'GeoMonitor.res' 'GeoMonitor.rc'}' 我在网上某处读到的那样,您不需要单独编译 RC 文件,Delphi 编译器会为您完成。
  • 带有点 ({.$R}),它是一个无所事事的声明(实际上是一个评论)。为了使其真正成为编译器指令,您需要删除. 以保留{$R 'GeoMonitor.res' 'GeoMonitor.rc'}。这可以解释为什么它不起作用 - 清单从未包含在内。

标签: windows delphi manifest access-denied administrator


【解决方案1】:

我认为你有两个问题:

  1. 您未能将 .rc 资源脚本文件编译为具有 .res 扩展名的已编译资源,并链接该资源。您不应链接 .rc 文件或 .xml 文件。您需要链接已编译的 .res 文件。使用 brcc32 或 rc 编译资源脚本。
  2. 我可以看出您没有链接 .res 文件,因为您的清单无效。如果你已经编译并链接了它,加载器会因为清单无效而拒绝你的可执行文件。

这是您需要的最低清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

显然,您需要添加更多内容,但从这里开始,使用一个已知良好的清单文件。证明它可以按您的预期工作。然后添加更多功能。

最后要说明的一点是,我怀疑您有禁用 UAC 的习惯。这是一个非常糟糕的主意,对于开发人员来说更是如此。如果您在过去 10 年中启用了 UAC,那么您很久以前就会遇到所有 UAC/标准用户问题。

【讨论】:

  • 不是争论,只是内存故障和好奇:Delphi 以前不是包含缩减版的 InstallShield 或类似版本吗?
  • @MartynA 我看不出这与问题或这个答案有什么关系。但我确实记得在一些古老的德尔福中有一些被削减的 IS。
  • 我的意思是,持续包含专业安装程序及其文档可能会鼓励 Delphi 开发人员掌握 UAC 等,而不是让他们绊倒或尝试绕过它。
  • +1 关于 UAC 的评论,开发者,请停止制作需要管理员权限的软件。在 10 次中有 9 次确实不需要它,只是懒惰。你让 Windows 的安全性降低了。
  • @DavidHeffernan 我的 RC 文件正在编译,在我编译我的项目后,我确实在我的项目文件夹中看到了 RES 文件。如果我从我的项目中删除 RC 文件,{.$R 'GeoMonitor.res' 'GeoMonitor.rc'} 将从我的 DPR 文件中消失。这样可以吗?我刚刚从我的 IT 人员那里得知,他在设置计算机时总是关闭 UAC,因为他讨厌它。这就解释了为什么我从来不需要处理这个......
【解决方案2】:
function CreateRunAsAdmin(const AppNamePath: string): boolean; //AppNamePath=CreateRunAsAdmin(Application.ExeName);
var
   RegisterTemp: TRegistry;
   openResult: Boolean;
begin
   RegisterTemp := TRegistry.Create;
   with RegisterTemp do
   begin
      RootKey := HKEY_CURRENT_USER;
      //openResult:=OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True);
      OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True);
      WriteString(AppNamePath, 'RUNASADMIN');
      Result := True;
      Free;
   end;
end;

【讨论】:

    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2018-11-14
    • 2013-01-20
    • 2013-09-27
    • 2017-06-03
    • 2016-01-30
    相关资源
    最近更新 更多