Как мое приложение C # может проверить, есть ли у пользователя доступ «Чтение» к сетевому ресурсу? - PullRequest
5 голосов
/ 15 апреля 2009

Я работаю над толстым клиентским приложением, которое часто сталкивается с «проблемами» при доступе к сетевым ресурсам. Перед выполнением любого ввода-вывода с сервером мое приложение проверяет, существует ли общий ресурс (обычно в форме \\ server \ share $). Это прекрасно работает для обнаружения тех сценариев, в которых клиент потерял соединение с сервером, но все еще существуют такие странные сценарии, где скрытый общий ресурс существует, но у пользователя нет прав на чтение из общего ресурса. Может ли кто-нибудь поделиться (без каламбура) кодом C #, необходимым для проверки, может ли текущий пользователь читать файлы на общем ресурсе? Должен ли я запрашивать ACL или файлы в общей папке? Что делать, если доля пуста? Что если пользователь является локальным пользователем без прав администратора в смешанной среде (рабочая станция XP Pro, сервер Windows 2003 без домена в сети Novell)?

Ответы [ 2 ]

10 голосов
/ 15 апреля 2009

Самый простой способ - просто сделать это (например, попытаться прочитать файл). Как упоминал Джаред, нет способа убедиться, что вы сможете читать в будущем (сбой сети, изменение разрешений и т. Д.).

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

3 голосов
/ 15 апреля 2009

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

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

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

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

...