Развертывание –> Совместимость приложений

Разрешение проблем совместимости с помощью Program Compatibility Assistant

В предыдущих частях цикла, посвященного совместимости приложений для ИТ-специалистов, мы познакомились с основными причинами несовместимости приложений в Windows 7 и обсудили, как изменения на уровне ядра операционной системы могут повлиять на работоспособность приложений. Во второй части мы рассмотрели инструменты и способы разрешения проблем совместимости приложений с операционной системой Windows 7. В этой части мы познакомимся с механизмом Program Compatibility Assistant, который используется пользователями для решения основных проблем несовместимости приложений.

Program Compatibility Assistant. Назначение

Механизм Program Compatibility Assistant (PCA), входящий в состав операционной системы Windows 7, позволяет отслеживать основные проблемы с совместимостью приложений, написанных для предыдущих версий операционной системы.  После выполнения программы, написанной для предыдущих версий операционной системы,  механизм PCA уведомляет пользователей о наличии каких-либо проблем и предлагает пути их решения. В случае возникновения серьезных проблем, PCA может заблокировать дальнейшее выполнения приложения во избежание нарушений в стабильности и безопасности работы операционной системы. В этом случае следует обратиться к онлайновым ресурсам.  

Утилита со схожим названием - Program Compatibility Wizard служит для ручной настройки уровней совместимости приложений. Об этой утилите мы поговорим ниже.

Program Compatibility Assistant. Основные сценарии

Ниже мы рассмотрим основные сценарии,  в которых пользователи могут столкнуться с работой Program Compatibility Assistant и обсудим применяемые этим механизмом решения возникающих проблем.

Обнаружение сбоев при установке приложений

Один из основных сценариев работы PCA связан со сбоями при установке приложений под управлением операционной системы Windows 7 и решением этих проблем применением режима совместимости с Windows XP.  Наиболее частой причиной таких сбоев является неверный алгоритм определения версии операционной системы, заложенный в приложении. Обычно приложения используют функции GerVersion() или GetVersionEx() для получения информации о номере версии операционной системы.  Для операционных систем Windows Vista и Windows 7 эти функции вернут число 6 как старший номер версии операционной системы. Если в приложении осуществляется проверка наличия версии ОС с числом 5 – старшим номером версии для Windows XP, такое приложение не установится под Windows Vista и Windows 7 и будет отображено сообщение об ошибке схожее с показанным ниже.

Рис. Пример сообщения об ошибке, связанного с версией ОС

Для исправления этой ошибки используется системная «заплатка» XPVersionLie, искажающая номер версии операционной системы для функций GerVersion() или GetVersionEx() и входящая в режим совместимости с Windows XP. В случае обнаружения описанной выше ситуации PCA отображает сообщение подобное показанному ниже сразу же после аварийного завершения программы установки приложения.

Рис. Пример сообщения PCA в случае обнаружения ошибки проверки версии ОС

Если пользователь выбирает опцию «Переустановить с рекомендованными настройками», к программе установки приложения будет применен режим совместимости WINXPSP2 и программа установки будет автоматически перезапущена.  

Обнаружение проблем с работой под User Account Control

Вторая группа сценариев работы PCA относится к работе приложений под управлением подсистемы User Account Control (UAC). PCA позволяет определять три различных типа сбоев, связанных с UAC, которые мы рассмотрим ниже.

Ошибки, связанные с запуском программ установки

PCA позволяет определить сценарии, когда приложение, запущенное без повышенных привилегий, запускает дочерний процесс, требующий повышенных привилегий.  Обычно это происходит в тех случаях, когда приложение пытается запустить программу обновления, т.к. в Windows Vista и Windows 7 возвращается новый код ошибки, означающий, что приложение пытается запустить дочерний процесс, требующий повышенных привилегий (этот код ошибки возвращается системной функцией CreateProcess(), отвечающей за создание всех процессов в системе).   Если та же программа обновления будет запущена из под Windows Explorer, она будет запущена с повышенными привилегиями, т.к. Windows Explorer умеет обрабатывать этот новый код ошибки. Windows Explorer отображает диалоговую панель UAC, предлагающую пользователю ввести учетные данные администратора или подтвердить повышение привилегий и после этого запускает такую программу. Пример диалоговой панели, отображаемой Program Compatibility Assistant в данном сценарии, показан ниже.

Рис. Пример сообщения PCA в случае обнаружения ошибки, связанной с UAC

В данном примере приложение попыталось запустить программу обновления, требующую повышенных привилегий и завершилось с ошибкой. К приложению был применен режим совместимости ELEVATECREATEPROCESS, позволяющий приложению успешно запустить дочерний процесс с повышенными привилегиями. Последующий запуск приложения произойдет уже без ошибки – вместо нее пользователь увидит диалоговую панель UAC, предлагающую пользователю ввести учетные данные администратора или подтвердить повышение привилегий. 

Обнаружение программ установки, требующих повышенных привилегий для запуска

Одно из требований в новых версиях ОС Windows – это запуск программы установки приложений с повышенными привилегиями. Это необходимо для того, чтобы программы установки могли успешно манипулировать системными каталогами и ресурсами – создавать каталоги, записывать файлы, сохранять настройки в реестре и т.п. Механизм определения программы установки, входящий в состав User Account Control, запрашивает у пользователей подтверждение повышения привилегий для таких программ, но в ряде случае программа установки может быть не определена средствами UAC. Обычно это происходит с программами установки, создаваемыми самостоятельно, без использования стандартных средств типа Install Shield или Microsoft Windows Installer. PCA позволяет обнаружить такие программы установки и отображает диалоговую панель, схожую с показанной ниже.

Рис. Пример сообщения PCA в случае обнаружения ошибки при установке приложения

Если пользователь выбирает опцию «Переустановить с рекомендованными настройками», к программе установки приложения будет применен режим повышения привилегий (RunAsAdmin) и программа установки будет автоматически перезапущена. 

Обнаружение компонентов панели управления, требующих повышенных привилегий

Последний сценарий, связанный с UAC, относится к компонентам Панели Управления, для запуска которых требуется повышение привилегий. PCAприменяет режим повышения привилегий (RunAsAdmin) и автоматически перезапускает компонент Панели Управления. 

Обнаружение ошибок, связанных с устаревшими компонентами Windows

В этом сценарии PCA позволяет исправить ошибки, связанные с использованием устаревших (удаленных) компонентов операционной системы Windows.  Например, PCA позволяет определить попытки доступа к динамическим библиотекам (DLL) или COM-объектам, отсутствующим в Windows Vista и Windows 7 – это происходит на уровне анализа ошибок, возникающих в функциях CoCreateInstance() и Loader (NTDLL). Если приложение пытается обратиться к известным PCA библиотеками или COM-объектам (этот список встроен в PCA), отображается показанная ниже диалоговая панель, работа приложения завершается и пользователю предлагается обратиться к онлайновым ресурсам для поиска решения возникшей проблемы. При выборе опции «Обратиться к онлайновым ресурсам», через механизм Windows Error Reporting в Microsoft отсылается сообщение об ошибке, в ответ на которое отображается мастер решения проблем – wercon.exe. Обычно предоставляется ссылка на базу знаний, где описываются альтернативы отсутствующим компонентам или отображаются ссылки для онлайновой загрузки таких компонентов.

Рис. Пример сообщения PCA в случае обнаружения ошибки при обращении к отсутствующим компонентам Windows

Определение неподписанных драйверов на 64-битной платформе

Для обеспечения стабильности работы платформы Windows и приложений, выполняющихся под ее управлением, в 64-битной версии ОС не поддерживаются неподписанные драйвера устройств. Если в системе установлен драйвер, не имеющий соответственной цифровой подписи, он не будет загружен.  Если пользователь перезагрузит систему, она не стартует, если неподписанный драйвер относится к группе драйверов времени загрузки (boot-time driver). Также, устройства или приложения, пытающиеся использовать неподписанный драйвер, могут работать со сбоями, что может првести к сбоям в работе самой операционной системы.

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

Рис. Пример сообщения PCA в случае попытки установки неподписанного драйвера

Если производится попытка установки неподписанного драйверов времени загрузки, PCA отключает загрузку такого драйвера для того, чтобы система могла стартовать после перезапуска. Механизм PCA следит за изменениями в реестре – в ветви KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, что позволяет определить момент установки в систему нового драйвера. Далее, получив местонахождение нового драйвера из реестра, PCA проверяет наличие у него цифровой подписи. Если драйвер не имеет таковой, PCAотображает показанное выше сообщение.

Оповещение пользователей о потенциально несовместимых приложениях

Помимо обнаружения проблем в режиме реального времени, которые мы рассмотрели выше, PCA также информирует пользователей о попытке запуска потенциально несовместимых приложений, которые перечислены в специальной системной базе данных  Отображаемые сообщения называются Application Help и могут быть двух типов – сообщения о «жесткой» блокировке (Hard Block) и сообщения о «мягкой» блокировке (Soft Block).

Сообщения о «жесткой» блокировке отображаются для приложений, которые заведомо несовместимы и их использование может привести к нарушениям в работе операционной системы. Ниже показан пример такого сообщения.

Рис. Сообщение о блокировке заведомо несовместимого приложения

В случае, когда о приложении известно, что у него есть ряд проблем с совместимостью, но они не влияют на стабильность работы операционной системы, отображается сообщение о «мягкой» блокировке, показанное ниже.

Рис. Сообщение о потенциально несовместимом приложении

И в том и в другом случае, выбор опции «Обратиться к онлайновым ресурсам» приводит к отсылке сообщения об ошибке через механизм Windows Error Reporting и отображению мастера решения проблем – wercon.exe. Обычно, предоставляется одно из трех следующих решений проблемы с несовместимыми приложениями:

  • Указание на возможность обновления приложения через сайт компании-разработчика
  • Указание на получение дополнительной информации на сайте компании-разработчика
  • Указание на статью в базе знаний Microsoft для получения дополнительной информации

Управление настройками PCA

Описанные выше исправления для приложений сохраняются в реестре в ветви Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers с элементами, содержащими полное имя приложения и строками, указывающими примененные к ним исправления.  Ветвь реестра HKEY_LOCAL_MACHINE служит для применения исправлений, которые будут применяться для всех пользователей, за исключением применения режима совместимости ELEVATECREATEPROCESS. В этом случает исправления сохраняются в ветви HKEY_CURRENT_USER и применяются только для текущего пользователя. Помимо упомянутой выше ветви, PCA сохраняет список всех приложений, для которых этот механизм обнаружил ошибки, даже если исправления и не применялись (например, пользователь выбрал опцию «Cancel» в соответствующей диалоговой панели) в ветвиHKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted.

Рис.  Настройки PCA в реестре

Отключение приложений от механизма PCA

Существует два способа отключения приложений от механизма PCA. В первом случае необходимо создать для приложения файл манифеста, в котором следует указать требуемый уровень привилегий, требуемых для запуска приложения. Это относится как к приложениям, так и к программах их установки.

Во втором случае можно отключения приложения от механизма PCA указав их в списке, который хранится в реестре в ветви HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Compatibility Assistant. Для отключения приложения следует указать его полное имя в параметре ExecutablesToExclude.

Для полного отключения механизма PCA можно использовать системную политику Turn Off Program Compatibility Assistant, которая находится в группе Administrative Templates\Windows Components\Application Compatibility редактора системных политик (gpedit.msc).

Также, с помощью системных политик можно отключить отдельные сценарии – они располагаются в группе Administrative Templates\System\Troubleshooting and Diagnostics\Application Compatibility Diagnostics редактора системных политик (gpedit.msc).

Рис. Настройки PCA в редакторе системных политик

Program Compatibility Assistant и системный журнал

В системном журнале отражаются основные активности Program Compatibility Assistant – они сохраняются в разделе  Application and Services Logs\Microsoft\Windows\Application-Experience\Program-Compatibility-Assistant\Operational, содержимое  которого можно посмотреть с помощью системной утилиты Event Viewer. Каждая запись о событии содержит следующую информацию:

  • Название приложения
  • Версия приложения
  • Полное имя приложения
  • Идентификатор сценария
  • Действия пользователя
  • Название примененного исправления

Рис.  Записи в системном журнале

В следующей таблице показаны идентификаторы сценариев Program Compatibility Assistant, используемые в системном журнале.

Идентификатор Описание
1 Определение ошибок при установке приложений (установка)
3 Определение ошибок при запуске программ установки приложений
5 Определение ошибок при использовании устаревших компонентов
8 Определение ошибок при запуске программ установки приложений, требующих повышения привилегий
9 Определение ошибок при запуске компонентов Панели Управления
10 Определение ошибок при установке приложений (удаление)
11 Определение неподписанных драйверов для 64-битной платформы

Оставайтесь с нами

В следующей части мы рассмотрим использование утилит, входящих в состав Application Compatibility Toolkit для решения проблем с обеспечением совместимости приложений.

Автор: Алексей Федоров

Продолжить обучение

Причины несовместимости приложений в Windows 7