Доступ на запись в папку Program Files - PullRequest
6 голосов
/ 11 ноября 2009

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

Один из первых шагов, которые выполняет средство обновления, - проверить, есть ли у него разрешение на запись в папку приложения

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);</p> <pre><code> if (!SecurityManager.IsGranted(perm)) { OnProgressChanged("Security Permission Not Granted \n The updater does not have read/write access to the application's files (" + _localApplicationCodebase + ")",MessageTypes.Error); return false; } OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase); return true;

При выполнении под Win7 / Vista этот код проходит (имеется в виду, что согласно CAS код имеет доступ на запись), однако, когда я пытаюсь записать файлы, я получил отказ в доступе (и подтвердил, что файлы НЕ используется)

Я понимаю, что Vista / Win7 UAC не позволяет пользователям записывать файлы в папки программных файлов. Однако я не понимаю, почему разрешение дается, если на самом деле оно не

С уважением,

Эрик Жирар

PS: если я запускаю тот же код с помощью «Запуск от имени администратора», он работает нормально

Ответы [ 3 ]

6 голосов
/ 11 декабря 2009

Важно знать о UAC: по умолчанию код не запускается с правами администратора и, следовательно, не может записывать в каталог Program Files. Даже если вы вошли в систему как администратор, приложения запускаются с правами обычного пользователя.

Есть два способа обойти это. Пользователь может запустить приложение с помощью пункта меню «Запуск от имени администратора». Но это зависит от пользователя, чтобы вспомнить что-то. Лучше было бы встроить манифест в ваш исполняемый файл, который запрашивает привилегии администратора. В манифесте задайте для свойства requestExecutionLevel значение requireAdministrator. Это заставит UAC запрашивать учетные данные администратора сразу же после запуска приложения.

Как сказал Дэниел, лучшее решение - поместить функциональность обновления в отдельное приложение. Ваше основное приложение будет иметь манифест, который устанавливает для selectedExecutionLevel значение «asInvoker», а ваше приложение для обновления с запросом «requireAdministrator». Ваше основное приложение может работать со стандартными привилегиями. Но когда должно произойти обновление, используйте Process.Start, чтобы запустить приложение для обновления, которое требует от пользователя ввода учетных данных администратора.

4 голосов
/ 11 ноября 2009

Лучший способ написать автообновление - это иметь вторичное приложение. Первая программа вызывает вторую с повышенными привилегиями, запрашивая UAC. Затем второе приложение может установить патчи.

1 голос
/ 06 июля 2010

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

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

затем перезапустите ваше приложение с помощью runas, чтобы позволить пользователю повысить права доступа

ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = Application.ExecutablePath;
Process.Start(processInfo);
...