Как программно проверить ЭФФЕКТИВНОЕ удаление (изменение) или разрешение на запись в .NET?

Заранее извините за длинный вопрос. Что меня действительно интересует, так это способ программной проверки, имеет ли удостоверение исполняемого окна адекватные права доступа Windows для записи в каталог (или файл) в приложении веб-служб ASP.NET. Но я согласен на получение эффективных прав на удаление (изменение) для пользователя для данного каталога или файла. Проблема в том, что я хотел бы иметь возможность делать это без записи временных файлов или необходимости выполнения операции ввода-вывода и обработки исключения.

Да, уже есть вопрос по этому вопросу (см. Как программно определить, есть ли у меня права на запись с использованием C # в .Net? ) Обычно я соглашусь с принятым ответом, что лучший способ - просто попробовать действие IO и обработать любой исключения - методы System.IO генерируют исключение System.UnauthorizedAccessException, чтобы указать на сбой в результате отказа в привилегии. Но в случае с файлами ЗАГРУЗКИ я действительно хотел бы проверить привилегии ДО того, как потратить время и ресурсы на загрузку данных, поскольку мы можем попытаться записать нужный файл или папку только ПОСЛЕ ЗАГРУЗКИ. Мне жаль, что пользователям, загружающим файл размером 2 ГБ по протоколу http, сообщают только после завершения загрузки, что у них нет прав на загрузку файла в место назначения.

Обычный подход к тестированию доступа на запись, если вы не хотите выполнять фактическую запись, - это запись временного файла. На другой вопрос есть ответ, указывающий на это. Это то, что в настоящее время делает наш код. НО безопасность Windows позволяет доступ на запись без прав на удаление. Пользователи с ТОЛЬКО доступом для записи, но без удаления, в конечном итоге оставляют все виды невосстановленных файлов .tmp. И нет, мы не хотим использовать учетную запись администратора домена, чтобы сбросить ACL на файлах tmp и затем удалить их. Подход, который я выбрал, состоит в том, чтобы проверить, есть ли у пользователя привилегии записи, используя System.IO.Directory.GetAccessControl (..) или System.IO.File.GetAccessControl (..) и имея дело с различными правилами доступа и возвратами ACE. ... но с этим у меня все еще есть проблемы, связанные с ЭФФЕКТИВНЫМИ привилегиями - т.е. в большинстве случаев мне также приходится искать пользователя ' s членство в любой из групп, перечисленных в ACE, которые имеют разрешения на объект. Должен быть более легкий путь ... не так ли?

15.12.2008 18:28:03
3 ОТВЕТА
РЕШЕНИЕ

Хорошо за то, что вы приложили дополнительные усилия для улучшения пользовательского опыта И пытались поддерживать чистую структуру программы. Возможно, если вы загружаете только то, что вы можете попытаться создать пустой файл-заполнитель с тем же именем, которое будет иметь конечный файл размером 2 ГБ, просто перезапишите его. Не идеально, так как вы все равно можете получить пустой файл, но довольно легко и, по крайней мере, немного более элегантно, чем некоторые альтернативы.

3
15.12.2008 20:42:26

@Paul, мне очень нравятся ваши ответы, и я думаю, что в обычных веб-приложениях, где есть известный и относительно небольшой набор потенциальных целевых каталогов загрузки, у вас есть правильное решение: 1 - Если в приложении могут быть пользователи, которые НЕ имеют Добавить данные Привилегии, все каталоги загрузки должны иметь известный тестовый файл, с которым проверяются операции добавления перед проверкой перед загрузкой.
2 - Если вы не беспокоитесь о привилегиях добавления данных, тогда приложение может просто выписать пустую версию файла и добавить ее при загрузке. Я принимаю ваш ответ, чтобы убедиться, что вы получите за это кредит.

К сожалению, в моем приложении у нас нет конечного или известного набора целевых каталогов для загрузки - любой ресурс или папка в сети могут быть доступны. Мы собираемся реализовать буферизацию загружаемых данных относительно небольшими порциями и открыть целевой файл в режиме добавления, НО удерживать FileStream OPEN на время загрузки (да, существуют проблемы с обработкой FileStream, которые так долго живут). выдает быстрое исключение (происходит, как только первая порция записывается в FileStream), если нет никаких прав записи без зависимости от прав на добавление данных. Но я бы никому не рекомендовал этот дизайн - если вам это удастся, попробуйте одно из предложенных @ Paul решений. И если вам не нужно беспокоиться о ранних сообщениях об отсутствии прав записи при загрузке, просто обработайте исключения и не

0
18.12.2008 19:20:40

У вас также может быть постоянный файл, скажем «access_test.txt», который вы пытаетесь перезаписать с помощью метки даты или чего-то еще, чтобы сначала проверить текущий доступ.

1
15.12.2008 20:42:38