В этой статье, которая является продолжением опубликованной в Windows IT Pro/RE № 4 статьи «Совмещая несовместимое», я попытаюсь ответить на вопрос, какие существуют способы заставить ваши приложения все-таки начать работать на новой операционной системе. Сразу стоит оговориться — это не панацея. Однако большинство современных приложений все же можно запустить в работу с правами Standard User в Windows Vista. И в этом нам поможет пакет утилит Application Compatibility Toolkit.

Общее назначение утилит этого набора:

  • предоставить графический интерфейс просмотра стандартной базы данных прослоек;
  • предоставить возможность создавать пользовательские базы для собственных приложений;
  • предоставить возможность диагностировать случаи несовместимости при работе с различными приложениями;
  • добавлять и редактировать сообщения appHelp — специальные оповещающие или запрещающие сообщения, привязанные к конкретному приложению. Обычно эти сообщения можно увидеть в Windows Vista. Они извещают пользователя о том, что конкретное приложение либо несовместимо, либо некорректно работает с Vista;
  • собирать информацию о проблемных приложениях в сети, для подготовки к переходу на Windows Vista;
  • распространять настройки базы прослоек на другие компьютеры сети.

В настоящее время Application Compatibility Toolkit 5.0 можно скачать на сайте Microsoft по адресу http://www.microsoft.com/downloads/details.aspx?FamilyId=24DA89E9-B581–47B0-B45E-492DD6DA2971&displaylang=en#filelist. Процесс инсталляции приложения стандартный, однако кроме самого ACT необходимо поставить утилиту Application Verifier, которую можно найти по адресу http://www.microsoft.com/downloads/details.aspx?familyid=C4A25AB9–649D-4A1B-B4A7-C9D8B095DF18&displaylang=en.

Теперь обо всем по порядку.

Compatibility Administrator

Первая утилита, о которой я хотел бы рассказать, — Compatibility Administrator. С ее помощью можно просмотреть содержимое системной базы прослоек в системе. Но самое главное, она позволяет создавать свои базы для конкретных приложений. Рассмотрим пример создания новой пользовательской базы, в которую положим конкретное приложение и привяжем к нему пользовательское сообщение appHelp. Сделаем это для знакомого всем блокнота, приложения Notepad.

  1. Запускаем Compatibility Administrator.
  2. Выбираем new database в разделе custom database.
  3. Открываем окно AppHelp, нажимая соответствующую кнопку на панели инструментов.
  4. Заполняем поля и выбираем приложение, к которому будет привязано сообщение (см. экран 1).
  5. Это окно показано на экране 2. Здесь можно выбрать список дополнительных метаданных исполнимого файла, при помощи которых загрузчик сможет точно идентифицировать его.
  6. В следующем окне вам предлагается выбрать вариант использования окна оповещения. Здесь можно просто оповестить пользователя о проблеме или запретить запуск приложения вообще (см. экран
    3).
  7. Далее будет предложено указать адрес URL и комментарий. URL может быть полезен, к примеру, в том случае, если в компании есть некое внутреннее приложение и свой внутренний сайт, связанный с ним. Предположим, ваша команда разработчиков занимается модернизацией какой-то части приложения, и поэтому некоторые функции недоступны. Указав здесь URL страницы с описанием проблемы и строками ее исправления, вы очень поможете своим пользователям и оградите и себя, и разработчиков от лишних звонков. Помимо ссылки, можно написать подробный комментарий. Однако помните, краткость — сестра таланта.

Экран 1. Создание AppHelp сообщения

Экран 2. Окно со списком свойств исполнимого файла 

Экран 3. Настройка типа AppHelp сообщения

Теперь необходимо сохранить эту базу данных, воспользовавшись соответствующей кнопкой на панели инструментов, а затем выбрать пункт Install в раскрывающемся меню. После этого появится соответствующее поддерево установленных баз данных, в котором вы увидите свою базу. Теперь при запуске notepad будет появляться окно с вашим сообщением. В Windows XP это окно имеет вид как на экране 4. Для того чтобы отключить это сообщение, выберите uninstall в меню установленной базы прослоек.

Экран 4. Окно с общением AppHelp в Windows XP

У Compatibility Administrator есть интересный параметр командной строки «/x». Запустив утилиту с данным параметром, в списке исправлений совместимости вы увидите намного больше прослоек, чем без него. Мало того, рядом с некоторыми прослойками будет значок «+», развернув который вы увидите дополнительные параметры этой прослойки. Эти параметры указывают, для каких модулей может применяться данная прослойка, а для каких ее использование будет блокировано. Наиболее яркий пример — это прослойка WinXPSP2 VersionLie. В Windows Vista с ней связан довольно обширный список ограничений, в результате которых эта прослойка не работает с приложениями, написанными на .NET.

Standard User Analyzer

Рассмотрим следующий инструмент, Standard User Analyzer (SUA). Его задача — определить проблемные места приложения и помочь с ними справиться. На самом деле, если быть предельно точным, SUA — это всего лишь оболочка, приложение для разбора журналов другого приложения, Application Verifier, без которого SUA не работает, что, несомненно, логично. Поэтому, прежде чем использовать SUA, вам придется загрузить и установить Application Verifier. Однако этот инструмент не сможет помочь во всем. Его основное предназначение — выявить узкие места приложения. А именно те функции приложения, которые могут не работать в Vista. Или будут возникать затруднения, и придется использовать виртуализацию.

Но, как говорится, лучше один раз увидеть, чем сто раз услышать. Поэтому попробуем посмотреть, что же все-таки происходит внутри приложений и почему они могут не работать в Vista или XP. Для начала воспользуемся специальным приложением demoapp.exe, которое поставляется вместе с комплектом Application Compatibility Toolkit. Это приложение может работать в двух режимах — в режиме установщика и обычном режиме. В режиме установщика оно показывает нам типичные ошибки, возникающие в процессе установки. А в обычном режиме — соответственно в работе приложения. Для того чтобы запустить это приложение в обычном режиме, нужно воспользоваться ключом «-runapp».

  1. Запускаем инструмент SUA и указываем необходимые параметры. Желательно указать путь к папке с символами для тестируемого приложения, если они есть. Символы — это связующее звено между бинарным исполнимым файлом и кодом. Файлы символов генерируются при компиляции приложения. В моем случае SUA воспользовался глобальной переменной, в которой хранится путь к локальной базе символов и к серверу символов Microsoft, см. экран 5.
  2. Флажок Elevate указывает, запускать приложение с повышенными правами либо с правами Standard User. В данном случае он неактивен, поскольку приложение стартует на Windows XP. Параметр Disable Virtualization отключает виртуализацию разделов реестра и папок в Vista. Тут он не активен по той же причине.
  3. В меню Мiew полезно поставить флажок для детального отображения информации.
  4. Запускаем.
  5. Закрываем. Видим первую ошибку, как на экране 6.
  6. Следом возникает ошибка Access Violation.

Экран 6. Ошибка реестра при закрытии demoapp 

Ждем некоторое время, пока произойдет разбор журнала Application Verifier. И вот первые результаты. На вкладках появляются значения количества подозрительных действий приложения (см. экран 7). На вкладке реестра видим ошибки. Эти ошибки возникли из-за недостатка разрешений на указанные разделы реестра. Это видно внизу, в полях дополнительных данных. Вернее, SUA показывает, что они могут произойти при запуске приложения с правами Standard User в Vista. Об этой особенности SUA нельзя забывать. Сначала решим проблему с реестром. Для этого воспользуемся Compatibility Administrator и создадим в нем новую базу для приложения demoapp.exe. К этому приложению в базе будем привязывать нужные нам прослойки. Для борьбы с ошибками доступа к реестру такого рода есть специальная прослойка — VirtualRegistry. Эта прослойка предназначена для того, чтобы перенаправить отдельные разделы реестра, к которым по умолчанию нет доступа, в другие разделы, для которых доступ открыт. По существу — действие, аналогичное принудительной виртуализации разделов реестра и путей файловой системы в Vista. Однако, к примеру, в XP такого механизма нет, а в Vista не все разделы виртуализируются. Итак, задействуем VirtualRegistry и указываем в качестве параметра следующую строку: ADDREDIRECT (HKLMSOFTWAREMicrosoft
PCHealthErrorReportingDW^
HKCUSoftwareDemoAppDW. Раздел HKCUSoftwareDemoAppDW создаем вручную и перенаправляем в него все обращения к разделу HKLMSOFTWAREMicrosoft
PCHealthErrorReportingDW, которые мы увидели в SUA. По рекомендациям Microsoft ошибка Access Violation, которая возникает при закрытии приложения для старых версий Windows, вполне вероятно, является следствием того, что приложение пытается выполнить выгрузку для библиотек, которые еще используются. Для борьбы с таким поведением рекомендуется задействовать прослойку IgnoreFreeLibrary, которая игнорирует вызов FreeLibrary для библиотек, указанных модулю в командной строке. В нашем случае этой библиотекой является demodll.dll. При помощи Compatibility Administrator привязываем к нашему приложению нужные исправления и указываем параметры (см. экран 8). Теперь, затаив дыхание, жмем кнопочку Test Run и указываем параметры командной строки для запуска в основном режиме. Приложение работает! Теперь закрываем его, и ошибка не возникает. Это победа! Мы заставили работать неработающее приложение!

Экран 8. Настройки compatibility fixes для тестового приложения

Кроме проблем с реестром, SUA определяет возможные проблемы несовместимости по многим направлениям:

  • обращения к файловой системе;
  • обращения к Ini-файлам;
  • при работе с маркерами доступа;
  • некорректные привилегии в маркере с точки зрения Vista;
  • обращения к глобальным объектам.

Все обнаруженные проблемы также будут отображаться в соответствующих вкладках SUA.

Диагностика прослоек и дополнительные настройки

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

  • Вы можете активировать вывод отладочных сообщений стандартными средствами Windows, а затем просматривать их при помощи Windows debugger или DebugView. Для этого нужно изменить следующий ключ реестра таким образом « [HKEY_CURRENT_USER SoftwareMicrosoftWindows NT CurrentVersionAppCompatFlags] «ShowDebugInfo»=dword:00000 009».
  • Если этого недостаточно, можно создать несколько переменных окружения «reg add «HKLMSYSTEMCurrent ControlSetControlSession ManagerEnvironment»/v SHIM_DEBUG_LEVEL/t REG_SZ/d 9/f reg add «HKLMSYSTEMCurrent ControlSetControlSession ManagerEnvironment»/v SHIM_FILE_LOG/t REG_SZ/d logfile.txt/f». В результате в каталоге %appdata% появится файл logfile.txt, в который будут записываться отладочные сообщения.

Еще один нюанс

Нужно помнить, что существует некоторая разница в терминологии самого движка прослоек и ACT. То, что в движке называется прослойками shim, в ACT зовется compatibility fix. А то, что в механизме называется layers, в ACT называют режимами совместимости compatibility modes. Отличия режимов совместимости от прослоек следующие. Во-первых, режим может выступать в роли контейнера для нескольких прослоек, которые будут применяться к приложению. Во-вторых, существуют особенности применения прослойки и режима. Прослойка применяется только к тому процессу, на исполнимый файл которого вы ее настроили. Однако если этот процесс создает дочерние процессы, то прослойка к ним не применяется. В отличие от прослойки, режим совместимости применяется и к дочерним процессам.

Application Compatibility Manager

Предположим, у вас большая организация, много пользователей, компьютеров и различных приложений. Каким образом можно быстро узнать, что представляют собой эти компьютеры, какие приложения на них установлены? Как можно классифицировать эти приложения? Выделить критичные для бизнеса? Определить, как они работают, какие проблемы возникают? На подобные вопросы поможет найти ответ утилита Application Compatibility Manager (ACM).

Эта программа, как и все предыдущие, входит в состав Application Compatibility Toolkit и предназначена для инвентаризации программного и аппаратного обеспечения компьютеров. А также предоставляет возможность классифицировать приложения и отслеживать возникающие проблемы. Единственным отрицательным и, на мой взгляд, довольно странным решением со стороны Microsoft стало решение создать онлайн-базу проблем для различных приложений, доступную сообществу. Все бы хорошо, однако доступна эта база вам только в том случае, если вы решите отдать информацию обо ВСЕХ своих приложениях в Microsoft. Вы можете указать, информацию о каких приложениях сделать доступной широкому кругу людей, однако клиент передает весь список приложений, которые у вас используются (см. экран 9).

В состав Application Compatibility Manager входит пять агентов.

Inventory Collector: этот агент, как следует из его названия, предназначен для сбора информации об аппаратном и программном обеспечении компьютера.

Internet Explorer Compatibility Evaluator (IECE): определяет проблемы в работе с сайтами или Web-приложениями. Полезен, к примеру, если в вашей сети есть свой сайт и вам необходимо знать, как он будет работать в Vista и IE 7. Собственно говоря, этот компонент полнофункционально работает только с IE 7, поскольку последний предоставляет расширенные функции журналирования.

User Account Control Compatibility Evaluator (UACCE): определяет проблемы совместимости приложений, которые могут возникнуть при работе с ограниченной административной учетной записью Vista или при работе в качестве обычного пользователя. Во время работы компонент наблюдает за взаимодействием операционной системы и приложения, чтобы выявить эти проблемы.

Update Compatibility Evaluator (UCE): используется для сбора информации о воздействии новых обновлений на компьютеры пользователей. То есть, прежде чем распространять обновления на все системы, стоит применить их на определенный набор компьютеров с установленным UCE, чтобы убедиться в том, что не возникнет каких-либо проблем.

Windows Vista Compatibility Evaluator (WVCE): нужен для того, чтобы выявить приложения, которые используют несовместимые или устаревшие для Vista механизмы, такие как применение нулевых сессий для служб или устаревшие методы работы с рабочим столом, использование GINA.

Кроме того, в общей инфраструктуре применяются такие компоненты:

  • ACT Log Processing Service: служба обработки собранных данных и загрузки их в базу данных;
  • ACT Log Processing Share: общая папка, в которую клиенты загружают собранные данные;
  • ACT Database: база данных MS SQL Server, в которую в конечном итоге попадают данные инвентаризации;
  • Microsoft Compatibility Exchange: Web-служба, при помощи которой вы можете отправить свои данные и загрузить себе информацию о проблемах в работе приложений и обновлений.

Необходимо особенно внимательно отнестись к работе с Update Compatibility Evaluator (UCE). Специалисты Microsoft рекомендуют проявлять осторожность, поскольку объем данных, генерируемый этим компонентом, в шесть-семь раз больший, чем объем данных, генерируемый другими компонентами. Рекомендуется не распространять UCE на компьютеры с менее чем 1 Гбайт свободного места на диске и менее чем 256 Мбайт оперативной памяти. Также общая папка должна быть всегда доступна и в ней должно быть достаточно дискового пространства, из расчета 60 Мбайт на компьютер в день.

Рассмотрим, как же все-таки собирать эту информацию. Общая структура работы с этим приложением представлена на экране 10.

По идеологии Microsoft процесс состоит из нескольких этапов:

  • сбор данных;
  • анализ данных;
  • тестирование и применение изменений.

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

Создание агента выглядит следующим образом.

  1. Запускаем Application Compatibility Manager.
  2. На вкладке Collect нажимаем кнопку Create new data collection package на панели инструментов.
  3. В появившемся окне указываем имя пакета, настройки начала его работы, а также место, где будет расположена общедоступная папка, в которую пакет будет писать инвентаризационную информацию.
  4. Главным элементом здесь является кнопка Advanced. Нажав ее, вы попадете в окно, в котором вам предстоит выбрать те агенты, которые будут входить в этот пакет. Агенты более подробно я опишу дальше, здесь скажу только, что агент Inventory Collector включен по умолчанию и входит во все пакеты, которые вы будете создавать. Тут же необходимо выбрать типы пакетов. В зависимости от типа вам будет предложен набор агентов, которые можно включить в пакет. Агента UCE можно включить только в пакет для проверки применения обновлений Windows.
  5. Система предложит сохранить пакет на жесткий диск.

На самом деле нет необходимости устанавливать агенты на всех компьютерах. Если вы, конечно, не хотите произвести полную инвентаризацию. Можно выбрать определенный набор систем, которые выполняют наиболее полный набор задач, и установить агенты на них. Запущенные агенты по расписанию, которое задается при их создании, собирают информацию и складывают ее в сетевую папку, данные о которой также добавляются в пакет на этапе его создания. Все это, несомненно, очень упрощает автоматическое развертывание агентов. Примечательно, что время жизни агентов ограничено. Оно задается при создании агента и составляет несколько дней. Журналы генерируются агентами с периодичностью в несколько часов, в зависимости от настроек при создании пакета. После окончания срока жизни агенты самостоятельно удаляются. После этого специализированная служба разбирает эти файлы и складывает данные в SQL Server, в специализированную базу данных. Эта база данных может располагаться как на SQL Server, так и на SQL Express (общая информация о поддерживаемых агентами платформах представлена на экране 11). Создать ее можно из меню ACM Tools, Settings. Там же настраивается служба обработки журналов, тип ее запуска и учетная запись, с правами которой будет работать служба. Заметим, что эта учетная запись должна иметь доступ как к общей папке с отчетами агентов, так и к базе, в которую эта служба будет вставлять обработанные данные. Таким образом, эта учетная запись не должна быть записью Local System. Результаты инвентаризации отображаются в ACM на вкладке Analyze.

На следующем этапе происходит анализ собранных данных. Основываясь на обработанных данных, загруженных туда модулем обработки, вы можете строить различного рода отчеты по фильтрам, которые можно накладывать на полученные данные. Для этого используется кнопка Toggle filter. После наложения фильтра его можно сохранить как файл и использовать как отчет в будущем. К примеру, можно выбрать все устройства типа «принтер», что даст вам список принтеров, локально установленных на компьютерах пользователей. Кроме того, для различных приложений можно выставлять разные признаки, например критичность для бизнеса, или систематизировать их по динамическому набору категорий, который вы также можете создавать самостоятельно. Для каждого приложения можно создавать записи о неполадках или об отсутствии проблем. В дальнейшем вся эта информация, если вы все-таки решите ею поделиться, будет отправлена в Microsoft. Взамен Microsoft пришлет аналогичную информацию, собранную другими людьми, использующими те же приложения, что и вы.

На последнем этапе, когда все данные собраны, мы можем узнать, с какими приложениями возникают проблемы. Синхронизировав наши данные с сервером Microsoft, мы, возможно, получим ответ вопрос, что же нам делать с этими приложениями и как справиться с несовместимостью. Это, конечно, только в том случае, если кто-то уже сталкивался с подобными проблемами, успешно с ними справился и поделился опытом через ACM. Если же нет — у нас есть SUA, с помощью которого мы и будем пытаться справиться с ними самостоятельно. Простой пример я привел в разделе, где описывал SUA. Задача на данном этапе — окончательно решить все наши проблемы. Затем настает долгожданный момент — мы наконец можем справиться со всеми проблемами на всех компьютерах сети. И для этого у нас уже все есть — созданная при помощи SUA и Compatibility Administrator база настроек. Эту базу можно сохранить в файл, а затем скопировать на все компьютеры сети. Дело за малым, установить ее там. Для этого используется утилита командной строки sdbinst:

Sdbinst.exe [-q] [-u filepath] [-g GUID]
   [-n "name"] [-?]

параметры которой представлены в таблице.

Поборов все проблемы

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

Андрей Вернигора (eosfor@gmail.com) — администратор баз данных и системный администратор на одном из предприятий компании «Укртранснафта». Имеет сертификат MCP


Экран 5. Настройки старта demoapp в SUA

Экран 7. Состояние вкладок SUA после первой ошибки

Экран 9. Данные, отправляемые в Microsoft

Экран 10. Архитектура сбора данных

Экран 11. Поддерживаемые агентами платформы

Таблица. Параметры командной строки sdbinst