Windows 2008: сбой приложения, когда __COMPAT_LAYER=ElevateCreateProcess
Есть приложение, которое может быть правильно запущено в Windows 2008, назовем его App1.
Когда одно и то же приложение запускается другим приложением (Launcher), происходит сбой приложения App1 в secur32.dll. Исследования показали, что среда в этих двух случаях была различной.
Когда происходит сбой приложения, его среда имеет одну дополнительную переменную __COMPAT_LAYER=ElevateCreateProcess.
Установка __COMPAT_LAYER=asInvoker на глобальном системном уровне не решила проблему. Добавление App1 и Launcher в реестр в HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers также не разрешает эту проблему.
Обе программы имеют следующие полномочия в своих манифестах: requiredExecutionLevel level = "asInvoker" uiAccess = "false"
UAC выключен. Обновления Windows актуальны. Единственное решение, которое помогает, это вставить другую программу между ними, которая очищает __COMPAT_LAYER или устанавливает его как asInvoker.
Что может быть причиной ElevateCreateProcess и как ее избежать? Спасибо.
2 ответа
Как оказалось, проблема была вызвана вызовом GetUserName во время dll init, который вылетает в Vista. Связанный пост - https://groups.google.com/group/microsoft.public.win32.programmer.kernel/browse_thread/thread/ae1b1e4ecbb6b123/1e9fefd4c8b12452
Причиной такого поведения может быть присвоение имени процессу запуска. Windows дополняет каждый процесс, соответствующий шаблону именования "*launch*.exe", с флагом ElevateCreateProcess. Это неловкое поведение указывается в базе данных shim для Windows\apppatch\sysmain.sdb. Вы можете просмотреть это, установив и запустив набор инструментов для обеспечения совместимости приложений. В разделе "Системная база данных (32-разрядная версия)/Applications/Autorun" вы можете найти эту запись. Хотя отключение может быть и рискованным, щелчок правой кнопкой мыши -> Отключить запись также не работает в моем случае.