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

27

我注意到了以下现象:

使用Delphi 7构建的可执行文件,如果名称中包含“Update”(例如“UpdateMyApp.exe”),会导致UAC出现警告,如“您要允许此程序对计算机进行更改吗?”

即使是一个简单的hello world应用程序,也会出现这种情况。在资源管理器中显示文件时,应用程序图标上会叠加盾形符号。

只要将exe改名,盾牌就会消失,应用程序就能够无警告启动。

如前所述,这仅适用于在Windows 7上启动的使用Delphi 7构建的程序(我猜在Vista上也是这样),而不适用于WinXP等其他操作系统。

使用Delphi 2007进行快速检查后,发现该问题已经解决了。

除了重命名文件以外,我还能做什么来防止这个问题?

1个回答

49
这种行为是由使用 Delphi 7 默认构建的应用程序没有清单引起的,或者有一个没有 requestedExecutionLevel 属性的清单。因此,当你的应用程序名称包含像 Setup 或者 Update 这样的词语时,Windows 就会认为你需要管理员访问权限。Installer Detection Technology 就是这个过程,它是随着 Windows Vista 与 UAC 一起引入的。
从 MSDN 网站上可以看到以下信息:
安装程序检测仅适用于:
1. 32 位可执行文件 2. 没有 requestedExecutionLevel 的应用程序 3. 以启用 LUA 的标准用户身份运行的交互式进程
在创建 32 位进程之前,将检查以下属性以确定它是否为安装程序:
- 文件名包含关键字,如 "install"、"setup"、"update" 等。 - 版本资源字段中的关键字:Vendor、Company Name、Product Name、File Description、Original Filename、Internal Name 和 Export Name。 - 嵌入在可执行文件中的 side-by-side 清单中的关键词。 - 链接在可执行文件中的特定 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>

这解释了为什么会发生,但没有说明如何解决它。 - Youda008
是的,它可以。请自行包含一个清单文件。如果您正在使用Delphi 7,则必须使用.RC源文件将清单编译为.RES文件,并使用RC.exe进行编译,然后使用{$R MyManifest.res}进行链接- Delphi XE及更高版本包括在IDE中选择自己的.manifest文件的支持。 - Warren P
1
我和Youda008遇到了同样的问题。这个答案详细介绍了如何创建、编译和包含一个清单文件。请注意,我必须运行“brcc32 uac.rc”命令;它没有自动编译。https://dev59.com/Q2Uq5IYBdhLWcg3wMNqu - FreeText

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接