Проблемы запуска приложений Delphi в режиме совместимости
Автор Nikolay Ilin на 14 марта 2016 03:05 PM

Вопрос
Имеем следующую проблему: SSO-агент блокирует запуск Delphi на одной из рабочих станций, а именно файлы delphi32.exe и install.exe: при запуске приложений без какого-либо перехвата окон появляется ошибка запуска приложения. Были предприняты следующие действия:
- удаление SSO-агента, результат - ошибка запуска исчезает, приложения запускаются;
- повторная установка SSO-агента, переименование файлов в delphi3232.exe и install123.exe, результат - ошибка запуска исчезает, приложения запускаются;
- переименование файла C:\Program Files (x86)\Indeed-ID\Enterprise SSO\IndeedID.SSO.black.list.dll в C:\Program Files (x86)\Indeed-ID\Enterprise SSO\IndeedID.SSO.black.list1.dll, результат - ошибка запуска исчезает, приложения запускаются.
ОС на рабочей станции: Windows Server 2008 R2 Standard SP1, на рабочей станции с ОС WinXP ситуация не повторяется.
Delphi версии 7

Ответ
Delphi запускается на Win 2008 R2, Win 7 x64 в режиме совместимости.
Для блокирования пользовательских приложений Indeed-Id Enterprise SSO использует механизм AppCertDlls, который позволяет регистрировать dll, которые экспортируют функцию CreateProcessNotify. Она и принимает решение о том, блокировать процесс или нет. В x64 окружении регистрируется 2 такие библиотеки (x86, x64) для блокировки приложений соответствующих типов.
И, при включении одновременно помощника по совместимости и механизма AppCertDlls в случае с Delphi происходит конфликт этих двух механизмов. Скорее всего речь идет о системной ошибке или же недокументированном моменте использования AppCertDlls в данном случае (хотя AppCertDlls сам по себе официально не документируется). Проявляется это следующим образом:
При наличии сколь-нибудь сложного кода (вызовы winapi, stl) в CreateProcessNotify() происходит сбой инициализации и старта процесса. Нашему коду управление не передается вовсе, дело не доходит даже до DllMain().
Если же код тривиален (сравнения и return'ы), то инициализация и старт происходят успешно.
При изменении имени исполняемого файла сигнатура приложения сбивается и ОС не воспринимает его как требующего особого режима совместимости. В этом случае все отрабатывает штатно.
Для проверки были сделаны тестовые AppCertDlls (32 и 64 бита), которые умеют только логгировать вызов своей функции. Результат был получен аналогичный, delphi начинает падать при регистрации в реестре тестовой x86 dll.
Экспортируемые функции описаны правильно, проблем со стеком быть не должно. Даже обойти это со своей стороны мы не можем, нам не передается управление.
Одним из возможных вариантов решения (кроме сбивания сигнатур исполняемых файлов) является ручное отключение SSO AppCertDlls. Сделать это можно в реестре, удалив значения из ключа HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDlls

Вопрос
Мы выполнили удаление указанных Вами значений для Indeed-Id из реестра. Ошибка после этого не проявляется, Delphi запускается, но фактически эта операция, насколько я понимаю, аналогична процедуре переименования блэклиста.
Также в одной части объяснения Вы говорите о том, что конфликтует процесс запуска приложения в режиме совместимости и работа SSO-агента (используемого им механизма AppCertDlls), с другой стороны, Вы пишете о том, что SSO-агент не влияет на запуск Delphi.
Кроме того, проблема нерешаема с точки зрения Indeed-Id, так как затрагивает базовые механизмы, на которых основывается работа системы. Таким образом, если я Вас правильно понимаю, мы должны быть готовы к тому, что у всех пользователей, работающих с 64-битными системами, после установки клиентских частей Indeed-Id начнут падать все (или некоторые) приложения, запускаемые в режиме совместимости, и единственным выходом будет отключение блэклиста SSO, хотя SSO-агент не влияет на запуск приложений, приэтом мы не сможем использовать для таких пользователей блокировку запуска нежелательных приложений, так как отключим блэклист для того, чтобы запускались приложения в режиме совместимости. Или я Вас неправильно понимаю?
Также мы проверили запуск Delphi при включенном и отключенном режиме совместимости: результат один и тот же - без дополнительных действий (переименование запускаемых файлов, блэклиста, удаления агента или ключей в реестре) приложение не запускается.

Ответ
SSO-агент не влияет на запуск Delphi с точки зрения своей внутренней функциональности, его код блокировки нежелательных приложений не выполняется при падении и до падения Delphi. Delphi 7 не является приложением, совместимым с ОС Windows 2008 R2 Server и Windows 7, поэтому ОС обрабатывает запуск этого приложения особым образом, основываясь на сигнатуре исполняемого файла.
Я думаю, проблемы могут быть только с приложениями, несовместимыми с теми версиями ОС, которые используются у пользователей и о запуске которых ОС предупреждает особым образом (как и в случае с Delphi). Для запуска подобных приложений при наличии запущенного SSO агента у конечных пользователей можно либо сбивать сигнатуры исполняемых файлов (переименование), либо отключать блокировку запуска нежелательных приложений.

(0 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)
Добавить новый комментарий
 
 
Полное имя:
Email:
Комментарии: