我有一个非常简单的程序,用于自动更新。 它检查服务器上的可用版本(HTTPS),下载新的更新并运行(可能更新的)程序。 这是一个用Delphi 7编写的旧程序。看起来这个程序需要在Windows 8和Windows 10下提升(以pipe理员身份运行)。这是一个问题,因为一旦程序升级,它也会启动升级的程序,那很糟糕。
程序代码非常简单,它只包含来自服务器的Indy组件(TIdHTTP)和ShellAPI来执行他下载的程序,一些IniFiles和一个进度条。
所以问题是这样的:我怎样才能找出哪些API调用需要提升,以及如何replace它? 是否有debugging器可以告诉哪些API调用(在哪个代码地址)需要提升?
这不一定是需要提升的API调用。 它可以简单地是程序名称。 它可能被称为东西像somethingUPDATE.exe
? 如果是这样,那么如果没有UAC清单来指定高程设置, 安装程序检测将启动,Windows将认为该程序是一个安装程序,并自动显示提升的UAC提示。 (对于包含Install
, Setup
, Patch
等的文件名也是如此)。
安装程序检测技术
安装程序是设计用来部署软件的应用程序,大部分都是写入系统目录和注册表项。 这些受保护的系统位置通常只能由管理员用户写入,这意味着标准用户没有足够的权限来安装程序。 Windows Vista以启发式方式检测安装程序并请求管理员凭据或管理员用户的批准,以便以访问权限运行。 Windows Vista也启发式检测更新程序和卸载程序。 请注意,UAC的设计目标是防止未经用户的知识和同意而执行安装,因为它们会写入文件系统和注册表的受保护区域。
安装程序检测仅适用于:
32位可执行文件
没有requestedExecutionLevel的应用程序
以启用LUA的标准用户身份运行的交互式进程
在创建32位进程之前,将检查以下属性以确定它是否是安装程序:
文件名包含“安装”,“设置”,“更新”等关键字。
以下“版本控制资源”字段中的关键字:供应商,公司名称,产品名称,文件说明,原始文件名,内部名称和导出名称。
嵌入在可执行文件中的并行清单中的关键字。
可执行文件中链接的特定StringTable条目中的关键字。
在可执行文件中链接的RC数据中的关键属性。
可执行文件中的目标字节序列。
注意
字节的关键字和序列是从各种安装技术中观察到的共同特征导出的。
这个链接也可能是有趣的:
使用SpecificNonInstaller修复程序
可能的原因是:
您的程序使用“setup”,“installer”,“updater”等词语进行命名。Windows正在查找.exe名称,版本和其他资源。
您的程序尝试写入HKLM或HKCR注册表配置单元或“程序文件”或“Windows \ System”文件夹。
建议在Windows XP中避免写入提到的regstry配置单元和文件夹,但是直到Windows Vista才能实施。
您可以阅读更多关于用户帐户控制和链接的文档。