Определение разрешений на запись в папку приложения - PullRequest
5 голосов
/ 12 ноября 2010

У меня есть приложение на C #, и мне нужно вывести некоторые данные в файл журнала во время работы.Я хочу дать пользователю возможность указать, где найти файл журнала, но по запросу клиента необходимо по умолчанию указать текущее местоположение приложения, которое обычно / Program Files /.

При развертывании моегоприложение на компьютере с Win7 / Vista, однако, приложение не записывает файл журнала, если я не запускаю программу от имени администратора.В то же время, кажется, что он молча обрабатывает случай, когда он не может записать файл, так как в настоящее время я обрабатываю все исключения, возникающие в процессе создания и записи файла.

В настоящее время я пытаюсь обнаружить отсутствие разрешения на запись обоими способами:

A) Создание объекта DirectorySecurity путем вызова «Directory.GetAccessControl ()» и

B) Проверкапривилегии безопасности с помощью метода «SecurityManager.IsGranted (permissions)»,

, но A не выдает исключение, когда я этого ожидаю, и B каждый раз возвращает true.

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

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

Спасибо!

Ответы [ 6 ]

5 голосов
/ 12 ноября 2010

Windows Vista и 7 будут хорошо записывать файлы в каталог Program Files.

Ну, не совсем, но программа думает, что это нормально.На самом деле файл записывается в каталог VirtualStore текущего пользователя;то есть в %userprofile%\AppData\Local\VirtualStore\Program Files

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

2 голосов
/ 13 ноября 2010

Существует три способа запуска приложения: повышенный уровень, преднамеренно не повышенный уровень (манифест говорит asInvoker) или случайно не повышенный уровень (нет манифеста). Приподнятые приложения смогут писать в Program Files. Умышленно не повышенным уровням приложения будет отказано в доступе. Случайно не повышенные приложения будут успешными, но файл будет записан в другом месте. Этот последний случай - то, что с тобой происходит. Это не молча провалилось. Вы просто не знаете, где находятся файлы. Смотрите http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx для скриншотов.

Поэтому, если пользователи настаивают на текущем каталоге, вы должны добавить манифест, запрашивающий asInvoker. Затем вы получите AccessDenied, и они увидят сообщение об ошибке. Я думаю, что они странные для того, чтобы хотеть этого. Спросите их, согласны ли они с одним дополнительным щелчком мыши, чтобы найти их: если так, сохраните ваше приложение, используя виртуализацию (я действительно не одобряю), не имея манифеста, а затем научите их нажимать кнопку «Файлы совместимости». Мое предпочтение: пиши в другом месте и манифест до asInvoker. Мой второй выбор: придерживаться текущего каталога, без манифеста, обучить их поиску виртуализированных файлов. Мой третий выбор: придерживаться текущего каталога, манифест для asInvoker, пользователи видят сообщения об ошибках, когда файлы журнала не записываются, но журналы теряются.

2 голосов
/ 12 ноября 2010

Вы можете заставить ОС запускать ваше приложение от имени администратора.

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
1 голос
/ 24 декабря 2010

У меня такая же проблема.У меня есть файл XML, в который я пишу ... Когда я устанавливаю приложение (C Sharp) и пытаюсь запустить приложение, получаю исключение из-за разрешения на запись.Когда я изменяю права доступа к файлу (даю права на чтение пользователям), он работает нормально ..

0 голосов
/ 12 ноября 2010

Помимо предложения Стефана П. поднять приложение для запуска с правами администратора, вы также можете изменить разрешение папки установки при установке, чтобы добавить группу «Пользователи» для доступа к записи. Тогда приложение также будет работать.

Перемещение местоположения файла журнала было бы лучшим вариантом.

0 голосов
/ 12 ноября 2010

Окончательный тест на то, есть ли у вас права на запись файла, - открыть его для записи.Т.е.

try
{
    File.Open(path, FileMode.OpenOrCreate);
    ...
}
catch(SecurityException)
{
   ... it failed for security reasons
}
catch(Exception)
{
   ... it failed for other reasons
}
...