为什么一个简单的控制台应用程序需要管理权限?
program LTUpdate;
{$APPTYPE CONSOLE}
begin
WriteLn('Hello World');
end.
- 如果我从命令提示符运行这个程序,什么也没有发生。
- 如果我以管理权限运行命令提示符,然后运行这个程序,它输出:
Hello World
是否有一个复选框在项目中设置应用程序需要管理权限?
(最后的程序将连接到一个数据库,得到一些字段,并在其他地方更新它,现在我可以通过VCL…但我想这次我会尝试一个简单的控制台应用程序。
您的应用程序被编译为32位,并且缺乏包含requestedExecutionLevel
值的UAC清单,因此UAC的"安装程序检测";功能启动,这就是为什么你的应用需要提升:
https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works
安装程序检测技术
安装程序是用来部署软件的应用程序。大多数安装程序写入系统目录和注册表项。这些受保护的系统位置通常只能由安装程序检测技术中的管理员可写,这意味着标准用户没有足够的访问权限来安装程序。Windows 10和Windows 11启发式地检测安装程序,并请求管理员凭据或管理员用户的批准,以便以访问权限运行。Windows 10和Windows 11还可以启发式地检测更新和卸载应用程序的程序。UAC的设计目标之一是防止安装在没有用户知情和同意的情况下运行,因为安装程序写入文件系统和注册表的受保护区域。
安装程序检测只适用于:
- 32位可执行文件。
- 没有请求执行级别属性的应用程序。
- 作为启用了UAC的标准用户运行的交互式进程。
在创建32位进程之前,将检查以下属性以确定它是否是安装程序:
- 文件名中包含"install,"设置";或"更新。
- "Versioning资源字段包含以下关键字:厂商、公司名称、产品名称、文件描述、原始文件名、内部名称和导出名称。
- 并列清单中的关键字嵌入到可执行文件中。
- 在可执行文件中链接特定StringTable项中的关键字。
- 资源脚本数据中的关键属性链接到可执行文件中。
- 可执行文件中有目标字节序列。
解决这个问题最简单的方法是在你的应用中添加一个UAC清单来指定一个执行级别:
- 进入"项目选项|应用程序|清单">
- 启用"自动生成">
- 设置"执行级别";根据需要(在本例中为"作为调用者")。就足够了)。
否则,你将不得不重新编译你的应用程序为64位,或更改其名称和版本资源,以避免指定的关键字。