UAC, requireAdministrator и доступ к файлам - PullRequest
0 голосов
/ 07 апреля 2011

У меня проблема с UAC в Vista / 7.Мой установщик с UAC Execution Level = requireAdministrator устанавливает и запускает мое приложение.Уровень выполнения приложения UAC = asInvoker.Итак, приложение запускается впервые - оно запускается от имени администратора.Затем приложение создает несколько файлов для хранения собственного состояния.Позже - если приложение запущено пользователем, а не администратором - приложение может только читать из созданных файлов, но не может их перезаписать. Я попытался отключить UAC в манифесте приложения или создать приложение без манифеста, но результат все тот же -- каждый файл, созданный при запуске приложения от имени администратора, не может быть перезаписан при запуске приложения от имени пользователя.Я пробовал некоторые другие программы установки, такие как Inno Setup, но ничего похожего на мою проблему ... Так что мой вопрос - почему это происходит в моем случае и как это исправить?Спасибо.

PS Важные замечания 1. На самом деле это не установщик.Это утилита для обновления исполняемых файлов основного приложения.Основное приложение проверяет сервер на наличие обновлений, если таковые имеются - загружает обновления во временную папку, а затем запускает утилиту с повышенными правами (http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx), чтобы заменить исполняемые файлы в папке Program Files. Основное приложение закрывается сразу после запуска утилиты. 2.Все файлы приложения хранятся в папке ProgramData \ myAppName.

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Вы не должны запускать основное приложение с повышенными правами, если оно не требует прав администратора.Какой тип установщика вы используете?

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

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

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

Примечание: разрешения по умолчанию для ProgramData позволяют всем создавать файлы и папкино только пользователь, создавший их, может изменять файлы (или администратор).Чтобы преодолеть это, у вас есть два варианта:

  1. Создание файлов данных непосредственно в профиле пользователя.У каждого пользователя будут свои данные.
  2. Создайте данные профиля пользователя из общего шаблона, хранящегося в ProgramData, как , предложенный Seva в опции 2 .В этом случае у каждого пользователя также будут свои собственные данные.
  3. Или измените списки ACL для данных своего приложения в каталоге ProgramData, чтобы их могли изменять все, а не только пользователь, создавший папку и файлы.
1 голос
/ 07 апреля 2011

Вы устанавливаете приложение только для текущего пользователя или для всех пользователей на машине?

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

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

Тем не менее, у вас есть три решения (фактически два решения и один взлом):

  1. Использовать установку для каждого пользователя. Установите ALLUSERS = 2 и MSIINSTALLPERUSER = 1. Ваш MSI будет работать без повышенных прав. MSI может свободно помещать любые файлы состояния в папку AppData.
  2. Использовать установку для каждой машины. Не пишите в приложения пользователя. Вместо этого запишите файлы начального состояния в% ALLUSERSPROFILE%. Они будут доступны только для чтения приложения. Измените приложение, чтобы при первом запуске скопировать исходное состояние из% ALLUSERPROFILE% в текущий профиль пользователя.
  3. Добавьте настраиваемое действие в ваш установщик, чтобы добавить пользователя в ACL.

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

...