我注意到以下现象:
使用Delphi 7构建的可执行文件和部分名称(包括“Update”)(例如“UpdateMyApp.exe”)会导致UAC显示警告,例如“您是否允许程序更改计算机” ”
这是一个简单的hello world应用程序。在资源管理器中显示该文件会显示覆盖在应用程序图标上的屏蔽符号。
重命名exe后,屏蔽消失,应用程序启动时没有警告。
如上所述,这只发生在使用Delphi 7构建并在Windows 7上启动的程序(我假设在Vista上相同),但不是在例如WinXP的。
使用Delphi 2007快速检查显示此问题已消失。
好笑......吓人......
除了重命名文件外,我还能做些什么来防止这种情况?
答案 0 :(得分:47)
导致此行为是因为默认情况下使用Delphi 7构建的应用程序没有清单,或者没有requestedExecutionLevel
属性。因为当您的应用程序名称包含 Setup
或 Update
等词语时,Windows 认为您需要管理员访问权限。此过程称为Installer Detection Technology
,与UAC一起引入Windows Vista。
来自MSDN网站:
安装程序检测仅适用于:
32位可执行文件
没有requestedExecutionLevel的应用程序
- 醇>
在启用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>