Как мое приложение 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 для получения дополнительной информации об исключениях, которые он выдает.

Самый надежный способ определить, имели ли вы разрешение на чтение из общего ресурса, - это

  1. Попробуй и прочитай из общего ресурса
  2. Обрабатывайте ошибки, которые могут возникнуть при чтении, и считайте, что неудачная попытка

К сожалению, хотя на основании вашего описания вы пытаетесь определить, есть ли у вас разрешение на чтение для общего ресурса. Нет надежного способа определить это.

Независимо от того, сколько ACL, каталогов и т. Д. Вы просматриваете в тот момент, когда вы просматриваете их, вы можете потерять доступ к общему ресурсу с помощью любого количества механизмов. Наиболее очевидным является снижение доли сети. Все, что вы можете определить, - это то, что вы имели разрешение на общий ресурс.

Другие вопросы по тегам