Разрешения на чтение для каталога в C #

Я заметил, что если вы измените настройки безопасности для определенного каталога, вы можете сделать эту папку «недоступной для просмотра» в Windows. В частности, изменение разрешения «Чтение» для администраторов на «Запретить» сделает эту папку недоступной.

Вопрос, который у меня сейчас есть, как мне понять это в коде? Я слежу за мной, но это все еще не правильно:

/// <summary>
/// Takes in a directory and determines if the current user has read access to it (doesn't work for network drives)
/// THIS IS VERY HACKY
/// </summary>
/// <param name="dInfo">directoryInfo object to the directory to examine</param>
/// <returns>true if read access is available, false otherwise</returns>
public static bool IsDirectoryReadable(DirectoryInfo dInfo)
{
    try
    {
        System.Security.AccessControl.DirectorySecurity dirSec = dInfo.GetAccessControl();
        System.Security.Principal.WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent();
        System.Security.Principal.WindowsPrincipal selfGroup = new System.Security.Principal.WindowsPrincipal(self);
        // Go through each access rule found for the directory
        foreach (System.Security.AccessControl.FileSystemAccessRule ar in dirSec.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)))
        {
            if (selfGroup.IsInRole((System.Security.Principal.SecurityIdentifier)ar.IdentityReference))
            {
                // See if the Read right is included
                if ((ar.FileSystemRights & System.Security.AccessControl.FileSystemRights.Read) == System.Security.AccessControl.FileSystemRights.Read)
                {
                    if (ar.AccessControlType == System.Security.AccessControl.AccessControlType.Allow)
                    {
                        // If all of the above are true, we do have read access to this directory
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
        // If we didn't find anything
        return false;
    }
    catch
    {
        // If anything goes wrong, assume false
        return false;
    }
}

Я близок к вышесказанному, но мне все еще не хватает чего-то огромного. Если щелкнуть правой кнопкой мыши папку, чтобы установить разрешения, я вижу (в моем примере) 3 группы или имена пользователей: «Администраторы, myUserName и SYSTEM». Если я установлю для параметра «Чтение» значение «Запретить» для «Администраторы» или «myUserName», я больше не смогу просматривать каталог. Если я только установлю «Система» на «Запретить», я все равно смогу просмотреть его.

Кажется, что подразумевается какая-то иерархия разрешений, где myUserName или Administrator заменяют группу / пользователя SYSTEM.

Приведенный выше код ищет первое «Разрешить» для «Чтение», которое он находит для моей идентификации пользователя и возвращает true. Я также мог бы написать код, который ищет первое «Deny» для Read и возвращает false.

Я могу установить папку «Чтение» - «Запретить» для SYSTEM и «Чтение» - «Разрешить» для двух других учетных записей и при этом прочитать папку. Если я изменю код для поиска Deny's, и он сначала встретится с идентификатором пользователя SYSTEM, моя функция вернет «false», что ... false. Это вполне может быть прочитано - «Разрешить» для двух других учетных записей.

Проблема, которую я до сих пор не могу понять, состоит в том, как я могу определить, какое удостоверение пользователя имеет приоритет над всеми остальными?

Ответы на вопрос(3)

Ваш ответ на вопрос