Как избежать UAC, если имя моего EXE-файла содержит слово «обновление»? - PullRequest
25 голосов
/ 09 ноября 2010

Я заметил следующее явление:

Исполняемый файл, созданный с Delphi 7 и частью имени, включая «Обновление» (например, «UpdateMyApp.exe»), заставляет UAC отображать предупреждение типа «сделать»Вы хотите разрешить программе вносить изменения в ваш компьютер ".

Это происходит с простым приложением hello world.При отображении файла в проводнике отображается символ экрана, наложенный на значок приложения.

Как только вы переименовываете exe, экран исчезает и приложение запускается без предупреждений.

Как уже упоминалось, это происходит только спрограммы, созданные с Delphi 7 и запущенные на Windows 7 (я полагаю, то же самое на Vista), но не на, например, WinXP.

Быстрая проверка с Delphi 2007 показывает, что эта проблема исчезла.

Забавно... страшно ...

Помимо переименования файла, что я могу сделать, чтобы предотвратить это?

1 Ответ

47 голосов
/ 09 ноября 2010

Это вызвано тем, что приложения, собранные с Delphi 7 по умолчанию, не имеют манифеста или не имеют атрибута requestedExecutionLevel. Из-за этого Windows считает , что вам нужен доступ администратора, если имя вашего приложения содержит такие слова, как Setup или Update. этот процесс называется Installer Detection Technology и был введен вместе с UAC с Windows Vista.

С сайта MSDN:

Обнаружение установщика относится только к:

  1. 32-битные исполняемые файлы

  2. Приложения без запрашиваемого уровня выполнения

  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>
...