Тест C#, если у пользователя есть доступ для записи к папке

Я должен протестировать, если пользователь может записать в папку перед фактической попыткой сделать так.

Я реализовал следующий метод (в C# 2.0), который пытается получить права доступа для Каталога использования папки. GetAccessControl () метод.

private bool hasWriteAccessToFolder(string folderPath)
{
    try
    {
        // Attempt to get a list of security permissions from the folder. 
        // This will raise an exception if the path is read only or do not have access to view the permissions. 
        System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
        return true;
    }
    catch (UnauthorizedAccessException)
    {
        return false;
    }
}

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

Будет мой метод, чтобы протестировать, если у текущего пользователя будет работа доступа для записи правильно?

178
задан Chris B 28 August 2012 в 09:03
поделиться

7 ответов

Это вполне допустимый способ проверить доступ к папке в C #. Единственное место, где он может упасть, - это если вам нужно вызвать это в замкнутом цикле, где накладные расходы на исключение могут быть проблемой.

Были и другие похожие вопросы. спрашивал ранее.

59
ответ дан 23 November 2019 в 20:16
поделиться

Я согласен с Эшем, это должно быть хорошо. В качестве альтернативы вы можете использовать декларативный CAS и фактически предотвратить запуск программы, если у них нет доступа.

Я считаю, что некоторые из функций CAS могут отсутствовать в C # 4.0 из того, что я слышал, а не уверен, может ли это быть проблемой.

0
ответ дан 23 November 2019 в 20:16
поделиться

Ваш код получает DirectorySecurity для данный каталог и правильно обрабатывает исключение (из-за того, что у вас нет доступа к информации безопасности). Однако в вашем примере вы фактически не опрашиваете возвращенный объект, чтобы узнать, какой доступ разрешен - и я думаю, вам нужно добавить это.

6
ответ дан 23 November 2019 в 20:16
поделиться

ИМХО, единственный 100% надежный способ проверить, можете ли вы писать в каталог, - это записать в него и в конечном итоге перехватить исключения.

11
ответ дан 23 November 2019 в 20:16
поделиться

У вас есть потенциальное состояние гонки в вашем коде - что произойдет, если у пользователя есть разрешения на запись в папку, когда вы проверяете, но до того, как пользователь фактически записывает в папку, это разрешение отозвано ? Запись вызовет исключение, которое вам нужно будет поймать и обработать. Так что первоначальная проверка бессмысленна. С таким же успехом вы можете просто писать и обрабатывать любые исключения. Это стандартный шаблон для вашей ситуации.

2
ответ дан 23 November 2019 в 20:16
поделиться

http://www.codeproject.com/KB/files/UserFileAccessRights.aspx

Very usefull Class, check for improved version in messages bellow.

2
ответ дан 23 November 2019 в 20:16
поделиться

Вы можете попробовать следующий блок кода, чтобы проверить, имеет ли каталог доступ на запись. Он проверяет FileSystemAccessRule.

string directoryPath = "C:\\XYZ"; //folderBrowserDialog.SelectedPath;
bool isWriteAccess = false;
try
{
    AuthorizationRuleCollection collection =
        Directory.GetAccessControl(directoryPath)
            .GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
    foreach (FileSystemAccessRule rule in collection)
    {
        if (rule.AccessControlType == AccessControlType.Allow)
        {
            isWriteAccess = true;
            break;
        }
    }
}
catch (UnauthorizedAccessException ex)
{
    isWriteAccess = false;
}
catch (Exception ex)
{
    isWriteAccess = false;
}
if (!isWriteAccess)
{
    //handle notifications 
}
3
ответ дан 23 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: