Ответ 1
Такое поведение вызвано тем, что приложения, созданные с помощью Delphi 7 по умолчанию, не имеют манифеста или имеют один атрибут requestedExecutionLevel
, Из-за этого Windows думает, что вам нужен доступ администратора, когда ваше имя приложения содержит слова типа Setup
или Update
. этот процесс называется Installer Detection Technology
и был представлен вместе с UAC с Windows Vista.
С сайта MSDN:
Обнаружение установщика применяется только к:
32-разрядные исполняемые файлы
Приложения без requestExecutionLevel
Интерактивные процессы, выполняемые в качестве стандартного пользователя с включенным LUA
Прежде чем создать 32-битный процесс, проверяются следующие атрибуты определить, является ли это Установщик:
- Имя файла включает такие ключевые слова, как "установка", "настройка", "обновление" и т.д.
- Ключевые слова в следующих полях Ресурсы Версии: Поставщик, Название компании, название продукта, файл Описание, оригинальное имя файла, Внутреннее имя и имя экспорта.
- Ключевые слова в бок о бок манифест, встроенный в исполняемый файл.
- Ключевые слова в определенных строковых записях, связанных в исполняемом файле.
- Ключевые атрибуты в данных 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>