Как мое приложение C# может проверить, есть ли у пользователя доступ "Чтение" к общему сетевому ресурсу?
Я работаю над толстым клиентским приложением, которое часто сталкивается с проблемами при доступе к сетевым ресурсам. Перед выполнением любых операций ввода-вывода с сервером мое приложение проверяет, существует ли общий ресурс (обычно в форме \\server\share$). Это хорошо работает для обнаружения тех сценариев, в которых клиент потерял свое соединение с сервером, но все еще существуют те странные сценарии, где скрытый общий ресурс существует, но у пользователя нет прав на чтение из общего ресурса. Может ли кто-то поделиться (без каламбура) кодом C#, необходимым для проверки того, может ли текущий пользователь читать файлы на общем ресурсе? Должен ли я запрашивать ACL или файлы в общей папке? Что делать, если доля пуста? Что если пользователь является локальным не-администратором в смешанной среде (рабочая станция XP Pro, сервер Windows 2003 без домена в сети Novell)?
2 ответа
Самый простой способ - просто сделать это (например, попытаться прочитать файл, например). Как уже упоминал Джаред, нет способа убедиться, что вы сможете читать в будущем (сбой сети, изменение разрешений и т. Д.).
Что касается кода, вы можете использовать класс DirectoryInfo для некоторых попыток ответа:
string remotePath = @"\\server\share$";
bool haveAccess = false;
DirectoryInfo di = new DirectoryInfo(remotePath);
if (di.Exists)
{
try
{
// you could also call GetDirectories or GetFiles
// to test them individually
// this will throw an exception if you don't have
// rights to the directory, though
var acl = di.GetAccessControl();
haveAccess = true;
}
catch (UnauthorizedAccessException uae)
{
if (uae.Message.Contains("read-only"))
{
// seems like it is just read-only
haveAccess = true;
}
// no access, sorry
// do something else...
}
}
В приведенном выше коде есть много недостатков (например, жестко закодированный тест "только для чтения"), но это всего лишь пример, используемый для иллюстрации того, что вы можете сделать. В DirectoryInfo есть несколько других вспомогательных методов, которые вы можете использовать для отображения файлов в папке. Если у вас нет доступа, методы выдают UnauthorizedAccessException
Исключение, которое вы можете использовать, чтобы проверить, почему не удалось получить доступ. Проверьте информацию о GetAccessControl для получения дополнительной информации об исключениях, которые он выдает.
Самый надежный способ определить, имели ли вы разрешение на чтение из общего ресурса, - это
- Попробуй и прочитай из общего ресурса
- Обрабатывайте ошибки, которые могут возникнуть при чтении, и считайте, что неудачная попытка
К сожалению, хотя на основании вашего описания вы пытаетесь определить, есть ли у вас разрешение на чтение для общего ресурса. Нет надежного способа определить это.
Независимо от того, сколько ACL, каталогов и т. Д. Вы просматриваете в тот момент, когда вы просматриваете их, вы можете потерять доступ к общему ресурсу с помощью любого количества механизмов. Наиболее очевидным является снижение доли сети. Все, что вы можете определить, - это то, что вы имели разрешение на общий ресурс.