当我的EXE文件名包含单词"update"时,如何避免UAC?

Chr*_*ian 26 delphi uac delphi-7

我注意到以下现象:

使用Delphi 7构建的可执行文件和部分名称(包括"Update")(例如"UpdateMyApp.exe")会导致UAC显示警告,例如"您是否允许程序对您的计算机进行更改".

这是通过简单的hello world应用程序实现的.在资源管理器中显示该文件会显示覆盖在应用程序图标上的屏蔽符号.

只要重命名exe,屏蔽就会消失,应用程序会在没有警告的情况下启动.

如上所述,这只发生在使用Delphi 7构建并在Windows 7上启动的程序(我假设在Vista上相同),但不是在例如WinXP上.

使用Delphi 2007快速检查表明此问题已消失.

有趣......吓人......

除了重命名文件外,我该怎么做才能防止这种情况发生?

RRU*_*RUZ 47

导致此行为的原因是默认情况下使用Delphi 7构建的应用程序没有清单,或者没有requestedExecutionLevel属性.因为Windows 认为您的应用程序名称包含像Setup或等字词时需要管理员访问权限Update.此过程被调用Installer Detection Technology,并与UAC一起引入Windows Vista.

从MSDN站点:

安装程序检测仅适用于:

  1. 32位可执行文件

  2. 没有requestedExecutionLevel的应用程序

  3. 作为标准用户运行的交互式进程启用了LUA

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

  • 文件名包括"安装","设置","更新"等关键字.
  • 以下版本控制资源字段中的关键字:供应商,公司名称,产品名称,文件描述,原始文件名,内部名称和导出名称.
  • 嵌入在可执行文件中的并排清单中的关键字.
  • 可执行文件中链接的特定StringTable条目中的关键字.
  • 可执行文件中链接的RC数据中的关键属性.
  • 可执行文件中的目标字节序列.

此外,Delphi 2007默认情况下在您的应用程序中包含requestedExecutionLevel密钥的清单.

这是delphi 2007创建的最明显的示例.您可以看到此清单requestedExecutionLevel在内容中具有该属性.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="CodeGear RAD Studio"
    version="11.0.2902.10471" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
Run Code Online (Sandbox Code Playgroud)