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

时间:2016-05-25 14:55:45

标签: windows delphi winapi

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

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

所以问题是:如何找出需要提升的API调用,以及如何替换它?是否有调试器可以告诉哪些API调用(在什么代码地址处)需要提升?

2 个答案:

答案 0 :(得分:11)

它不一定是需要提升的API调用。它可能只是程序名称。它可能被称为somethingUPDATE.exe之类的东西吗?如果是这样,那么在没有UAC清单指定高程设置的情况下,Installer Detection将启动,Windows将认为该程序是安装程序并自动显示UAC提示以进行提升。 (包含InstallSetupPatch等文件名也是如此。

  

安装人员检测技术

     

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

     

安装程序检测仅适用于:

     
      
  1. 32位可执行文件

  2.   
  3. 没有requestedExecutionLevel的应用程序

  4.   
  5. 在启用LUA的情况下以标准用户身份运行的交互式进程

  6.         

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

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

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

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

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

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

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

    •   
         

    注意

         

    关键字和字节序列源自各种安装程序技术中观察到的共同特征。

此链接可能也很有趣:

Using the SpecificNonInstaller Fix

答案 1 :(得分:3)

可能的原因是:

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

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

对于Windows XP,建议不要写入提到的regstry配置单元和文件夹,但在Windows Vista之前不会真正强制执行。

您可以阅读有关User Account Control和关联文档的更多信息。