Инструменты совместимости приложений Microsoft (часть 2)

Опубликовано: 24 Апреля, 2023

Стандартный пользовательский анализатор (SUAnalyzer)

Стандартный пользовательский анализатор просто великолепен. Он использует верификатор приложений на серверной части для создания дополнительных журналов приложений, в которых рассматривается все, включая привилегии и использование токенов. На самом деле, если у вас есть только верификатор приложений версии 3.X и вам не нравится идея просмотра множества XML-журналов, то использование SUAnalyzer значительно упростит и облегчит интерпретацию.

Пример:

Запустить SUAnalyzer от имени администратора очень просто:

  1. Выберите вкладку Информация о приложении.

  1. Нажмите кнопку «Обзор» и перейдите к исполняемому файлу целевого приложения, в данном случае d:appsinfopakinfopak.exe.
  2. Если требуются какие-либо параметры командной строки, введите их в поле «Параметры» (в этом примере нет).
  3. Если вы не являетесь администратором, вам нужно установить флажок «Запустить с повышенными правами» (но он установлен по умолчанию для администратора), а затем нажать кнопку «Запустить».

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

Примечание:
SUAnalyzer будет ждать завершения всех дочерних процессов, созданных приложением, прежде чем начнет загружать файл журнала. Поэтому, если кажется, что это длится вечность, вы можете предположить, что все дочерние процессы не завершены, и вам может потребоваться завершить процессы вручную. Либо так, либо используйте кнопку «Обновить журнал», чтобы загрузить файл журнала.

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

В следующей таблице перечислены функции отчета, доступные в SUAnalyzer, по вкладкам:

Вкладка

Подробности

Файл

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

Реестр

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

INI

Перечисляет проблемы API WriteProfile, например, когда приложение пытается записать в системный INI-файл.

Токен

Перечисляет проблемы с проверкой маркеров доступа. например, когда приложение использует вызов API CheckTokenInformation для проверки того, входит ли текущий пользователь в группу администраторов.

Привилегия

Перечисляет проблемы с привилегиями. например, если приложение пытается использовать расширенные привилегии, такие как «SeLoadDriverPrivilege».

Пространство имени

Перечисляет проблемы, которые возникают, когда приложение пытается создать системные объекты (например, события, сопоставления памяти) в ограниченном пространстве имен.

Другие объекты

Перечисляет проблемы, связанные с доступом к объектам, отличным от файлов и разделов реестра.

Процесс

Перечисляет проблемы, связанные с повышением прав процесса.

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

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

Пример:

Я приведу пример, который вызвал у меня некоторое огорчение до того, как появился SUAnalyzer Info Pak версии 5.6. Это приложение можно использовать для полного документирования того, как использовать приложение, записывая использование приложения и воспроизводя «документирование» шагов процесса в текстовом документе.

Если вы запускаете Инфопак от имени администратора, он открывает назначенный документ Word, все настраивает, а затем приостанавливает запись процесса (см. ниже)

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

Я бросил все на Infopak.exe, пытаясь выяснить, где что-то не работает, и, кроме ошибки.Net, которая не указывала нам правильное направление, не было никаких признаков того, что что-то не так.

Затем я попробовал SUAnalyzer.

Одна из замечательных вещей, которые делает SUAnalyzer, заключается в том, что он также отслеживает все дочерние процессы. Именно тогда пенни упал, потому что именно тогда, когда winword.exe попытался использовать некоторые привилегии администратора, все было скрыто.

Когда я запустил SUAnalyzer для Infopak.exe, я получил следующий результат «привилегии использованы». Обратите внимание, что это было сделано от имени администратора, чтобы приложение могло работать и полностью контролироваться.

Обратите внимание, что у нас есть даже такие приятные вещи, как трассировка стека используемой функции:

vfluapriv2!NS_LuaPriv::AuditPrivilege+154
vfluapriv2!NS_LuaPriv::VfHookNtAdjustPrivilegesToken+88
ADVAPI32!AdjustTokenPrivileges+1e
SETUPAPI!CM_Get_Device_Interface_List_Size_ExW+111b
SETUPAPI!CM_Get_Device_Interface_List_Size_ExW+fd8
SETUPAPI!CM_Get_Device_Interface_List_Size_ExW+3b
SHELL32!SHGetMalloc+5e2
SHELL32!SHGetMalloc+580
SHELL32!SHGetMalloc+459
SHELL32!SHGetMalloc+525
SHELL32!Ординал57+ба
SHELL32!SHGetFolderPathW+50b
SHELL32!SHParseDisplayName+206
SHELL32!SHParseDisplayName+147
SHELL32!SHParseDisplayName+372
SHELL32!SHParseDisplayName+310
SHELL32!SHParseDisplayName+147
SHELL32!SHParseDisplayName+94
SHELL32!SHILCreateFromPath+5d
SHELL32!DllCanUnloadNow+5e3
SHELL32!ILFindChild+39
SHELL32!SHGetFolderLocation+68
SHELL32!SHGetSpecialFolderLocation+17
mso!Порядковый номер7+500
mso!MsoCreateIOLDocFromWzPersistentName+2bf
mso!MsoCreateIOLDocFromWzPersistentName+2b
WINWORD!+3022dcac
WINWORD!wdCommandDispatch+49586


























Использование других привилегий (SeSystemtimePrivilege и SeUndockPrivilege) оказалось немаловажным, но в данном случае требовалось предоставить пользователям Infopak привилегию «Загружать и выгружать драйверы устройств», чтобы Infopak работал правильно. Хотя это вызывает некоторые проблемы с безопасностью, все вовлеченные пользователи пользовались доверием, и предоставление им привилегии считалось оправданным.

Дополнительная проблема заключалась в том, что winword.exe проверял, работает ли пользователь Infopak от имени администратора, например, на вкладке «Токен»:

Для этого потребовалось исправление совместимости ForceAdminAccess (описанное ниже в разделе администратора совместимости), чтобы мы могли замаскировать сбой. Затем было несколько ключей реестра, но об этом позаботилось исправление совместимости LUARedirectReg.

Предупреждение!!

Следует обратить внимание на то, что если вы изменяете привилегию с помощью групповой политики, назначение привилегии, применяемое к групповой политике, ЗАМЕНЯЕТ назначение локальной привилегии. Это очень важно, потому что если вы ошибетесь и удалите важного локального пользователя из локальной привилегии (например, SERVICE), все может сломаться очень интересным образом. Поверь мне, это так, я знаю.

На самом деле гораздо менее опасно использовать утилиту NTRights из комплекта ресурсов Windows Server 2003, потому что она позволяет добавлять дополнительных привилегированных пользователей к существующим локальным привилегиям, ничего не теряя, например, в этом случае:

Дополнительно

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

Журналы Name Space и Other Objects дополняют очень полную картину того, что делает ваше приложение.

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

Администратор совместимости приложений

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

Я привел таблицу наиболее интересных исправлений из более чем 200 доступных исправлений. Помимо блестящих исправлений LUA, всем, у кого есть медленное приложение на основе сервера Interbase, понравится SingleProcAffinity, а SearchPathInAppPaths отлично подходит для опубликованных приложений, которые не работают из-за того, что требуемые библиотеки DLL находятся в нескольких папках.

Исправление совместимости

Описание исправления

DisableScreenSaver

Отключает хранитель экрана при запуске приложения и восстанавливает его при выходе из приложения. Это полезно для приложений DirectX, которые плохо работают с активной экранной заставкой.

ForceAdminAccess

Устранены проблемы, которые могут возникнуть, когда приложение использует вызов API CheckTokenInformation для проверки того, входит ли текущий пользователь в группу администраторов. Исправление перехватывает вызовы CheckTokenInformation и возвращает значение true.

Скрыть панель задач

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

Локальный сопоставленный объект

Принудительно помещать все объекты сопоставления файлов с глобальными именами в локальное пространство имен.

LUARedirectFS

Перенаправляет файлы в %SystemDrive%Documents and SettingsusernameLocalAppDataRedirecteddrivefilepath, когда приложению требуется запись в них, но у него нет соответствующих прав доступа.

LUARedirectReg

Приложения могут ошибочно пытаться выполнить запись в часть реестра HKEY_LOCAL_MACHINE. Это исправление совместимости перенаправляет ключи реестра в куст HKEY_CURRENT_USER, когда у приложения нет необходимых разрешений.

ЛУАТрекФС

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

Мовевиниторегистри

Приложения могут по-прежнему хранить данные в файлах INI вместо использования реестра. Это универсальное исправление совместимости для перемещения данных INI в реестр. Исправление совместимости запускается из командной строки.

SearchPathInAppPaths

Перехватывает вызовы SearchPath API и изменяет команду для поиска в разделе реестра App Paths оболочки.

SetEnvironmentVariable

Позволяет приложению задавать определенные переменные среды при запуске приложения. Эти переменные предоставляются через командную строку, а несколько переменных среды в списке должны быть разделены вертикальной чертой (|).

Синглпрокаффинити

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

Пользовательский интерфейс администратора совместимости на первый взгляд немного сложен, но на самом деле им довольно легко пользоваться.

Пример:

Многие старые приложения открывают ключи реестра для полного доступа, даже если требуется доступ только для чтения. В этом примере исправлена ошибка доступа к реестру, которую Volo View Express получает при попытке создать/удалить ключи в HKCR (в приведенном выше примере с верификатором приложения).

То же самое исправление работает для Photoshop, RFFlow и целого ряда других старых приложений:

  1. Запустите администратора совместимости и выберите «Пользовательские базы данных» > « Новая база данных», щелкните правой кнопкой мыши и выберите «Переименовать». Назовите исправление приложения, например Voloview Fix. Это необязательное косметическое изменение, но оно помогает вам отслеживать ситуацию, если вы делаете несколько исправлений одновременно.

  1. Щелкните правой кнопкой мыши Voloview fix и выберите «Создать новый», затем «Исправление приложения».

  1. Введите имя приложения, например, Voloview, Поставщик приложения (необязательно) и перейдите к исполняемому файлу приложения. Затем нажмите Далее.

  1. Выберите «Нет» для режима операционной системы и нажмите «Далее».

  1. Выберите LUARedirectReg, убедитесь, что флажок установлен, и нажмите «Далее».


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


  1. Выберите «Файл» > «Сохранить», чтобы сохранить пользовательскую базу данных совместимости приложений, в данном случае Voloview_fix.sdb. Сохраните базу данных либо в специальной области исправлений, либо в том же каталоге, что и исполняемый файл. Нажмите Сохранить.


  1. Чтобы установить это исправление совместимости приложений, выберите «Файл» > «Установить» в графическом интерфейсе администратора совместимости приложений, например


  1. Прежде чем вы закончите, нужно сделать немного документации. Каждой базе данных исправлений приложений присваивается уникальный идентификатор GUID, который потребуется, если вы хотите удалить исправление. Щелкните правой кнопкой мыши пользовательскую базу данных Voloview_Fix и выберите «Свойства», например

Запишите GUID, в данном случае {315b1bd4-98a8-4e7e-815e-0506c5f47e43}.

Если вы хотите установить это исправление совместимости приложений на все серверы в ферме серверов Citrix:

  1. Скопируйте файл voloview_fix.sdb на все серверы фермы:

  1. Затем установите исправление с помощью psexec (sysinternals pstools):

Это так просто.

Теперь происходит то, что когда пользователь LUA запускает Volo View Express, когда приложение пытается изменить (записать/создать/удалить) любое значение или ключи в HKCR, исправление совместимости приложения LUARedirectReg перенаправит эти изменения в HKCUSoftwareClasses.

Стоит отметить, что этот подход работает для Access 97, сосуществующего с Access 200X, а также для огромного количества других старых приложений. И очень просто добавить исправление совместимости к установке приложения по сценарию. Например:

:: установить RFFlow 5.02
cd /d "y:RFFlow502_msi"
msiexec /i "rfflow502.msi" /l*vc:install fflow_msi.log /qb-
:: применить исправление appcompat для RFFlow, чтобы подавить ошибки доступа к реестру
sdbinst -qc:installappfixes ff_fixes.sdb



Если вы хотите удалить исправление совместимости приложений, все, что вам нужно, это GUID исправления (именно поэтому я попросил вас записать его) и запустите sdbinst –g {guid}, например

Другие исправления совместимости

Как я упоминал ранее, существует множество полезных исправлений совместимости приложений для служб терминалов ( и заблокированных рабочих станций). Что касается LUA, у нас есть LUARedirectFS, которая позаботится о приложениях, файлы конфигурации которых находятся в исполняемом каталоге, а также о тех, которые записывают временные файлы в каталог приложения или глобальное местоположение. Например

LUARedirectFS можно использовать для перенаправления c:program filesmyappmyapp.ini на %userprofile%appdatalocalvirtualstoreprogram filesmyappmyapp.ini.

Вывод

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

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

Инструменты совместимости приложений Microsoft (часть 1)