Помогите понять, почему диалог UAC всплывает на Win7 для нашего приложения - PullRequest
6 голосов
/ 03 февраля 2010

У нас есть неуправляемое приложение C ++, которое, как представляется, вызывает запрос UAC. Кажется, это происходит на Win7, а НЕ на Vista

К сожалению, UAC dlg является системной модальностью, поэтому я не могу подключить отладчик для проверки кода, в котором он находится, и запуск под msdev (мы используем 2008) выполняется в повышенном режиме.

Мы помещаем окно сообщения в начале нашей программы / winmain, но оно даже не заходит так далеко, так что, очевидно, это в коде запуска.

Что может вызвать уведомление UAC так рано и что я могу сделать, чтобы отследить причину?

EDIT

Очевидно, что манифест является здесь важной проблемой, но, похоже, он мне не помогает - или, возможно, я неправильно настраиваю файл манифеста.

Может ли кто-нибудь предоставить образец манифеста?

Кроме того, выясняет ли магия компоновщика / UAC, что программа «может» записывать в реестр и устанавливать свои требования к UAC на основании этого? Существуют пути кода, которые могут инициировать UAC, но мы даже не в тот момент, когда появляется UAC dlg.

Дополнительная странность заключается в том, что этого не происходит в Vista с включенным UAC.

Вот манифест (который, я думаю, был / был сгенерирован автоматически):

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

А затем этот был добавлен в список манифестов, чтобы посмотреть, поможет ли это

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity 
    version="1.0.0.0" 
    processorArchitecture="x86" 
    name="[removed for anonymity]" 
    type="win32" 
/> 
<description>
    [removed for anonymity]
</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="x86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        />
    </dependentAssembly>
</dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>        
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Ниже приведены данные из самого EXE-файла, использующего инструмент ManifestViewer

- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="x86" name="[removed]" type="win32" /> 
  <description>[removed]</description> 
- <dependency>
- <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> 
  </dependentAssembly>
  </dependency>
- <dependency>
- <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> 
  </dependentAssembly>
  </dependency>
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
- <security>
- <requestedPrivileges>
  <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
  </requestedPrivileges>
  </security>
  </trustInfo>
  </assembly>

Возможно, это связано с настройкой совместимости xp в нашем приложении. Я должен проверить это. (мы установили это в установщике, который я обнаружил, потому что некоторые звуковые драйверы не работают правильно на win7)

Ответы [ 5 ]

11 голосов
/ 04 февраля 2010

Windows автоматически повышает уровень приложений на основе различных критериев (перечисленных в Общие сведения об управлении учетными записями пользователей в Windows Vista ):

Перед созданием 32-битного процесса, следующие атрибуты проверены определить, является ли это Установщик:

  • Имя файла включает в себя такие ключевые слова, как «установить», «настроить», «обновить» и т. Д.
  • Ключевые слова в следующих полях ресурса управления версиями: поставщик, название компании, название продукта, описание файла, исходное имя файла, внутреннее имя и имя экспорта.
  • Ключевые слова в параллельном манифесте, встроенном в исполняемый файл.
  • Ключевые слова в определенных записях StringTable, связанных в исполняемом файле.
  • Ключевые атрибуты в данных RC, связанных в исполняемом файле.
  • Целевые последовательности байтов в исполняемом файле.

Лучшее решение для всего этого - создать манифест, который предотвращает повышение прав , хотя переименования файла может быть достаточно.

5 голосов
/ 03 февраля 2010

Если вы даже не дойдете до своей основной функции, то либо DLL, используемая вашим приложением, что-то делает при инициализации DllMain, либо ваше приложение имеет манифест, запрашивающий повышение прав.

Я думаю, вы должны иметь возможностьудаленно отлаживать его с помощью windbg;когда появится подсказка, вы можете взломать отладчик и посмотреть, что пытается сделать ваше приложение.

2 голосов
/ 03 февраля 2010

Первым делом я проверю манифест приложения.Это одна из первых вещей, которую Windows рассматривает при создании процесса.Он определенно взаимодействует с UAC.

1 голос
/ 06 февраля 2010

В Windows 7 (но не в Vista), если вы говорите, что приложению нужны настройки совместимости с XP, оно также повысится. См. Отличается ли UAC на Win7 от Vista? - если вам не нужно повышать уровень, но вам нужно пометить XP compat, я не думаю, что вы можете что-то сделать. OTOH, если вам не нужно быть совместимым с XP, перестаньте просить его.

0 голосов
/ 08 февраля 2010

Dependency Walker (depenen.exe) wqs изначально написан для устранения проблем с DLL, но его режим профилирования более полезен.Он может быть использован для сбора большого количества информации о создании процесса.Было бы интересно посмотреть, в частности, какие библиотеки DLL необходимы, а какие были загружены в момент запроса UAC.Также вполне возможно, что в выводе Depenceny Walker явно упоминается UAC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...