Delphi 10.4.2:为什么控制台应用程序需要管理权限?

use*_*012 8 delphi uac manifest console-application elevated-privileges

为什么简单的控制台应用程序需要管理权限?

program LTUpdate;

{$APPTYPE CONSOLE}

begin
  WriteLn('Hello World');
end.
Run Code Online (Sandbox Code Playgroud)
  • 如果我从命令提示符运行该程序,则不会发生任何事情。
  • 如果我使用管理权限运行命令提示符,然后该程序输出:

    你好世界

项目中是否有某个复选框将应用程序设置为需要管理权限?

(最终的程序将连接到数据库,获取一些字段并在其他地方更新它,现在我可以通过 VCL 来完成......但我想这次我应该尝试一个简单的控制台应用程序。)

Rem*_*eau 11

您的应用程序正在编译为 32 位,并且缺少包含requestedExecutionLevel值的 UAC 清单,因此 UAC 的“安装程序检测”功能启动,这就是您的应用程序需要提升的原因:

\n

https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works

\n
\n

安装人员检测技术

\n

安装程序是设计用于部署软件的应用程序。大多数安装程序都会写入系统目录和注册表项。这些受保护的系统位置通常只能由安装程序检测技术中的管理员写入,这意味着标准用户没有足够的访问权限来安装程序。Windows\xc2\xa010 和 Windows\xc2\xa011 启发式检测安装程序,并请求管理员凭据或管理员用户的批准,以便以访问权限运行。Windows\xc2\xa010 和 Windows\xc2\xa011 还会启发式检测更新和卸载应用程序的程序。UAC 的设计目标之一是防止在用户不知情和同意的情况下运行安装,因为安装程序会写入文件系统和注册表的受保护区域。

\n

安装者检测仅适用于:

\n
    \n
  • 32 位可执行文件
  • \n
  • 没有请求的执行级别属性的应用程序。
  • \n
  • 以启用 UAC 的标准用户身份运行的交互式进程。
  • \n
\n

在创建 32 位进程之前,会检查以下属性以确定它是否是安装程序:

\n
    \n
  • 文件名包含“install”、“setup”或“update”等关键字。
  • \n
  • “版本控制资源字段包含以下关键字:供应商、公司名称、产品名称、文件描述、原始文件名、内部名称和导出名称。
  • \n
  • 并排清单中的关键字嵌入在可执行文件中。
  • \n
  • 特定 StringTable 条目中的关键字链接在可执行文件中。
  • \n
  • 资源脚本数据中的关键属性链接在可执行文件中。
  • \n
  • 可执行文件中有目标字节序列。
  • \n
\n
\n

解决此问题的最简单方法是将 UAC 清单添加到您的应用程序以指定执行级别:

\n
    \n
  • 转到“项目选项|应用程序|清单”
  • \n
  • 启用“自动生成”
  • \n
  • 根据需要设置“执行级别”(在本例中,“作为调用者”就足够了)。
  • \n
\n

否则,您必须将应用程序重新编译为 64 位,或者更改其名称和版本资源以避免指定的关键字。

\n