2012-01-12 5 views
7

В .NET существует ли простой способ проверить, имеет ли текущий пользователь доступ к созданию файла в каталоге? То, что эквивалентно функции C++ _access, было бы идеальным.В .NET убедитесь, что текущий пользователь может записать в каталог

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

Я не хочу использовать System.DirectoryServices: смотрю на ACL, разрешая членство в группах и то, как взаимодействуют разрешения из разных членов группы, кажется склонным к ошибкам и слишком сложным. Там где-то должна быть функция «да-или-я», нет?

Заранее благодарен!

[править] как бонус, если он будет работать и для сетевого ресурса, это было бы круто.

+1

http://stackoverflow.com/a/265958/284240 Следовательно, обрабатывайте Исключения. –

+0

Возможный дубликат [Как проверить, могу ли я создать файл в определенной папке в C#?] (Http://stackoverflow.com/questions/316903/how-to-check-if-i-can-create-a -file-in-a-specific-folder-in-c) – Joe

+0

проверить этот ответ, преобразовать его в VB.NET должен быть тривиальным ;-) http://stackoverflow.com/a/130641/559144 –

ответ

5
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); 
if (SecurityManager.IsGranted(writePermission)){ 
    //write here 
} else { 
    //some error message 
} 
+0

Предполагая, что это работает (я надеюсь), один из тех ответов, который заставляет меня поднять, перепросить вопрос и любить его :) –

+0

Выглядит отлично! Позвольте мне попробовать. –

+1

Кажется, это не работает для меня. По какой-то причине он всегда возвращает true. Это должно быть то, что я делаю неправильно, но это так прямолинейно, я не понимаю, что это будет./sigh ... Я отметил его как принятый, потому что он указывает мне на правый API. Мне просто нужно это обработать, я думаю, –

0

Ниже будет возвращать экземпляр класса DirecotrySecurity http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx

DirectoryInfo(pathstr).GetAccessControl() 
+1

Это относится к текущему пользователю? Я посмотрел на это, и он, казалось, дал доступ к ACL.Он может сказать, что пользовательская группа «Foo Managers» имеет доступ на запись, а «Рабочие панели» отрицается, но не помогает мне решить, является ли текущий пользователь членом группы, входящей в одну из этих групп. Может быть, я пропустил, как решить этот бит. –

5

Проверка разрешения заранее является рискованный проект. Не говоря уже о сложном запуске всего списка ACL и вычислении эффективного набора разрешений.

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

«правильный» способ сделать security demand, либо декларативно с FileIOPermissionAttribute или императивно, путем создания соответствующего экземпляра FileIOPermission и вызова его метода Demand(). Если у вас есть необходимые разрешения, вызов Demand() преуспевает; в противном случае он выбрасывает SecurityException, который вам нужно поймать и действовать.

По моему опыту, настоятельная проверка проще.

Следует также отметить, что в Windows 7, хотя вы можете концептуально иметь доступ на запись к каталогу, он все равно может не работать, если вы не работаете с повышенными разрешениями.

+0

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

Смежные вопросы