2013-11-23 3 views
0

Я унаследовал обслуживание приложения, которое при его запуске иногда приводит к появлению диалогового окна администратора UAC (Do-you-wish-to-allow-this?) , Для меня очевидным первым, что нужно попробовать, является «включить ведение журнала UAC», запустите приложение, чтобы диалоговое окно появилось, затем найдите запись в журнале, которая говорит, например, «2013-11-23-19: 10:03 [MyApplication] попытался записать запись в реестре [MyRegistryKey]. Требуется авторизация администратора », а затем предпринять шаги для решения проблемы, чтобы диалоговое окно не отображалось, когда приложение используется.Поиск причины повышения UAC в Windows 7

Тем не менее, некоторые люди размещали вопросы о регистрации в UAC в 2008/09 году по отношению к Vista, и ответ был чем-то вроде «UAC не регистрируется, но это будет отличная функция для будущей версии». Был ли ведение журнала UAC когда-либо реализованным, либо в Windows 7, либо в качестве выпуска исправлений? Если нет, есть ли альтернативный метод, который обычно используется?

+0

Вы являетесь разработчиком этого приложения? Если нет, вы не в том месте. SuperUser отвечает на вопросы, связанные с управлением компьютером, которые не связаны с программированием. –

+0

Спасибо, Бен. Да, я смотрю на это с точки зрения разработчика. Я незнакома с приложением, но если я знаю, что происходит не так, я могу сразу получить доступ к коду и, возможно, домой в решении. Это ты имел в виду? – westwell

+0

Итак, вы собираетесь перестроить приложение из источника? Да, это важно, а не там, где вы получили код, но что вы делаете изменения кода, а не, например, просто находите оскорбительную запись реестра и меняете ее разрешения. –

ответ

0

найти запись в журнале, что говорит, например, "2013-11-23-19: 10: 03 [MyApplication] попытался написать запись реестра [MyRegistryKey] Требуется админ авторизации."

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

Windows 7 в основном ведет себя так же, как Windows XP в этом отношении. Если ваше приложение работает как обычный пользователь, пытается написать:

HKLM\Software\Cotoso\Litware 

приложение получит сообщение об ошибке Access Denied.

Если файл и виртуализация реестра не включена для некорректных приложений

К сожалению, большинство приложений написаны плохо. Большинство приложений, когда они запускаются в качестве стандартного пользователя в Windows 2000 или Windows XP, ужасно ломаются. Начиная с 1999 года, как часть требований к логотипу Windows, Microsoft потребовала от разработчиков тестировать свои приложения во время работы в качестве стандартного пользователя. Почти никто никогда не делает.

Вот почему, начиная с Windows Vista, Microsoft добавила функцию, которая позволяет приложения багги думаю он успешно написал HKLM или Program Files. Если сбой записи, который имел бы, был бы успешным, если бы пользователь был администратором, Windows переиздает операцию записи, за исключением того, что на этот раз перенаправит его на какое-то место, которое будет успешным. Например:

writes to 
    HKLM\Software 
are redirected to 
    HKCU\<User SID>_Classes\VirtualStore\Machine\Software 

writes to 
    C:\Program Files 
are redirected to 
    C:\Users\Westwell\AppData\Local\VirtualStore\Program Files 

Ни один из этих механизмов перенаправления не приведет к повышению вашего приложения при следующем запуске. Обе эти функции - временные взломы. Вы можете сообщить Windows, что вы написали приложение правильно, уклонению файла и virtualzation реестра, путем добавления requestedExecutionLevel из asInvoker для сборки манифеста приложения:

<?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="client" type="win32"/> 

    <description>Westwell Contoso</description> 

    <!-- Disable file and registry virtualization --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges> 
      <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

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

Когда UAC Elevation произойдет

Есть пять причин, почему приложение может побудить поднять на запуск:

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

    Если приложение необходимо запускать как администратор, и не может выполнять никакой полезной функции, не будучи администратором, то вы можете проявить ваше приложение как requireAdministrator (а не asInvoker):

    <description>Westwell Contoso</description> 
    
    <!-- Disable file and registry virtualization --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
        <security> 
         <requestedPrivileges> 
         <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
         </requestedPrivileges> 
        </security> 
    </trustInfo> 
    

    Если это так, приложение всегда будет работать как администратор. Вот и все.

  2. Вы обнаружили, что ваше приложение должно быть запущено как администратор , только если пользователь фактически является администратором.

    Применения, подобные RegEdit могут работать нормально как стандартный пользователь, они не требуют повышения. Но если пользователь на самом деле является администратором, RegEdit может запросить возвышение до полных административных прав администратора. Это делается путем маркировки приложения как highestAvailable (а не asInvoker или requireAdministrator):

    <description>Westwell Contoso</description> 
    
    <!-- Disable file and registry virtualization --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
        <security> 
         <requestedPrivileges> 
         <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
         </requestedPrivileges> 
        </security> 
    </trustInfo> 
    

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

  3. Опция Compatibilty отметила приложение как Запуск от имени администратора.

    Пользователь может выбрать пометить приложение так, что она должна запрашивать повышение:

    enter image description here

    состояние этого флажка (и другие галочки) хранится в реестре:

    HKCU\Software\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers 
    

    и "всех пользователей" по:

    HKLM\Software\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers 
    

    enter image description here

    Эта опция может быть выполнена для каждого пользователя или для каждой машины. Таким образом, некоторые пользователи могут увидеть подсказку с возвышением, а другие - нет. Это может быть источником вашей проблемы.

  4. Installer detection heuristics.

    По умолчанию Windows попытается распознать, что приложение, вероятно, является установщиком (например, setup.exe, install.exe, update.exe) и предложит пользователю поднять. Эта функция может быть отключена с помощью групповой политики, имя политики - User Account Control: Detect application installations and prompt for elevation.

Легкий Fix

Простое исправление просто пометить приложение asInvoker. Это отключит эвристику.

После этого на машине должна быть установлена ​​возможность сопоставления (AppCompatFlags в HKCU или HKLM).

Bonus Чтение

+0

Спасибо, Иэн. В конце концов я дошел до сути. В ваш полный список был включен правильный ответ на эту проблему («Эвристика UAC» привела Windows к мысли, что приложение было установщиком), поэтому я отмечаю это как ответ. Я также добавляю больше деталей в отдельный ответ, если это полезно для других. – westwell

2

Я решил эту проблему в конце концов. Вот что случилось.

1) Я попробовал предложение Бена использовать инструменты sysinternals. Инструменты, которые казались полезными были

DependencyWalker ProcessExplorer ProcessMonitor

Каждый из них дают много информации о том, что происходит, и я могу видеть, что они должны быть первым портом захода для многих, если не большинство, проблемы с Windows. Тем не менее, в моем случае я дважды щелкнул приложение и получил диалоговое окно UID для пользователя/пароля, но затем обнаружил, что инструменты были написаны не так много информации, до тех пор, пока диалог не появился.

Было также полезно переварить содержимое книг Microsoft Internals Windows Internals при попытке устранить проблемы с UAC.

2) Я пробовал использовать набор средств обеспечения совместимости приложений, но он не обнаружил проблем с программой либо на XP (где она работала), либо на Windows 7 (как со стандартным пользователем, так и с интерфейсом UAC и пользователем администратора, который работал)

3) Затем я попытался тщательно воссоздать приложение с нуля, начиная с пустого проекта, а затем постепенно копируя файлы и настройки. На каждом этапе я проверил, будет ли приложение запускаться без всплытия диалога UAC.

В конце концов я применил изменение, и это вызвало появление диалога UAC. Это было приложение VB6, и я изменил «название приложения» и «название продукта» в диалоговом окне «Проект», «Свойства», «Создать». Предыдущим (неудачным) значением каждого поля было «Обновление ApplicationName». Чтобы приложение работало без повышения UAC, мне нужно было удалить слово «Обновить».

Как было предложено выше Ian, похоже, что применялись эвристики UAC и значения в пределах exe. Я вижу, что в книге Windows Internals говорится о сканировании байтовых последовательностей в exe при принятии решения о том, следует ли поднимать.

4) Итак, подход, который сработал для меня, состоял в том, чтобы собрать приложение пополам и посмотреть, на каком этапе запускается диалоговое окно UAC. Как только это произойдет, знание четырех причин, которые дал Ян в предыдущем ответе, становится важным.

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

Смежные вопросы