为什么我的win32程序需要提升?

我有一个非常简单的程序,用于自动更新。 它检查服务器上的可用版本(HTTPS),下载新的更新并运行(可能更新的)程序。 这是一个用Delphi 7编写的旧程序。看起来这个程序需要在Windows 8和Windows 10下提升(以pipe理员身份运行)。这是一个问题,因为一旦程序升级,它也会启动升级的程序,那很糟糕。

程序代码非常简单,它只包含来自服务器的Indy组件(TIdHTTP)和ShellAPI来执行他下载的程序,一些IniFiles和一个进度条。

所以问题是这样的:我怎样才能找出哪些API调用需要提升,以及如何replace它? 是否有debugging器可以告诉哪些API调用(在哪个代码地址)需要提升?

这不一定是需要提升的API调用。 它可以简单地是程序名称。 它可能被称为东西像somethingUPDATE.exe ? 如果是这样,那么如果没有UAC清单来指定高程设置, 安装程序检测将启动,Windows将认为该程序是一个安装程序,并自动显示提升的UAC提示。 (对于包含InstallSetupPatch等的文件名也是如此)。

安装程序检测技术

安装程序是设计用来部署软件的应用程序,大部分都是写入系统目录和注册表项。 这些受保护的系统位置通常只能由管理员用户写入,这意味着标准用户没有足够的权限来安装程序。 Windows Vista以启发式方式检测安装程序并请求管理员凭据或管理员用户的批准,以便以访问权限运行。 Windows Vista也启发式检测更新程序和卸载程序。 请注意,UAC的设计目标是防止未经用户的知识和同意而执行安装,因为它们会写入文件系统和注册表的受保护区域。

安装程序检测仅适用于:

  1. 32位可执行文件

  2. 没有requestedExecutionLevel的应用程序

  3. 以启用LUA的标准用户身份运行的交互式进程

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

  • 文件名包含“安装”,“设置”,“更新”等关键字。

  • 以下“版本控制资源”字段中的关键字:供应商,公司名称,产品名称,文件说明,原始文件名,内部名称和导出名称。

  • 嵌入在可执行文件中的并行清单中的关键字。

  • 可执行文件中链接的特定StringTable条目中的关键字。

  • 在可执行文件中链接的RC数据中的关键属性。

  • 可执行文件中的目标字节序列。

注意

字节的关键字和序列是从各种安装技术中观察到的共同特征导出的。

这个链接也可能是有趣的:

使用SpecificNonInstaller修复程序

可能的原因是:

您的程序使用“setup”,“installer”,“updater”等词语进行命名。Windows正在查找.exe名称,版本和其他资源。

您的程序尝试写入HKLM或HKCR注册表配置单元或“程序文件”或“Windows \ System”文件夹。

建议在Windows XP中避免写入提到的regstry配置单元和文件夹,但是直到Windows Vista才能实施。

您可以阅读更多关于用户帐户控制和链接的文档。