Приложение не будет работать под UAC, даже если оно не требует никаких привилегий. - PullRequest
1 голос
/ 04 ноября 2008

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

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

Просто чтобы понять это:

XP as admin:          Fine  
XP as limited user:   Fine
Vista no UAC admin:   Fine
Vista no UAC limited: Fine
Vista UAC admin:      FAIL
Vista UAC limited:    FAIL

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

РЕДАКТИРОВАТЬ: Я должен извиниться за то, что задал проблему намного сложнее, чем она первоначально возникла. На самом деле мы нашли по крайней мере одну ошибку в виртуализации папок и думаем, что есть и другие. На этом этапе единственная разумная надежда запустить его - найти вызов API, который может быть выполнен как пользователь с ограниченными правами, который отключает виртуализацию папок для вызывающего процесса и любого процесса, который он порождает (рекурсивно). Причина, по которой мы не можем просто добавить манифест, заключается в том, что вызовы программного обеспечения сторонним программным обеспечением, которые в действительности могут различаться в зависимости от компьютера.

Ответы [ 3 ]

4 голосов
/ 04 ноября 2008

Поиск виртуализации файловой системы и реестра в Windows Vista. Если ваше приложение использует определенные части файловой системы и / или реестра, вы обнаружите, что ваше приложение «работает», то есть API успешно работают без ошибок, но эти данные не сохраняются там, где вы ожидаете. В частности, многие области, которые могли бы быть разделены между несколькими пользователями на одном компьютере, теперь вышли за пределы, и данные фактически попадают в некоторое хранилище, специфичное для текущего пользователя. Через некоторое время вы обнаружите, что пользователи на самом деле не разделяют одни и те же данные.

Есть способ остановить эту виртуализацию. Укажите файл манифеста для вашего приложения, чтобы сообщить, что оно знает о UAC, как описано здесь ... http://msdn.microsoft.com/en-us/library/bb756929.aspx.

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

2 голосов
/ 12 сентября 2009

После всего этого времени я нашел решение, которое работает.

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

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

Справочный материал: http://msdn.microsoft.com/en-us/library/aa965884%28VS.85%29.aspx

1 голос
/ 04 ноября 2008

Где приложение пытается записать файл? Если он пытается записать в место установки в папке «Program Files», вы можете получить странные ошибки, так как запись здесь запрещена в Vista, и любые созданные здесь файлы фактически создаются в виртуальной папке в другом месте - хотя для приложения они (как правило) кажутся быть там, где их ожидает.

Возможно, вы захотите попробовать запустить приложение в режиме совместимости с XP.

...