Как я могу проверить папки, которые имеют ТОЛЬКО доступ к списку? - PullRequest
2 голосов
/ 13 декабря 2011

Я написал сегмент кода для проверки папок со следующими настройками разрешений:

Folder with ONLY list access

Обратите внимание, что у пользователя нет функций чтения и выполнения, чтения и т. Д. Все, что у него есть, это «Список содержимого папки». И это так, как нам нужно.

Однако, когда я сканирую этого конкретного пользователя в этих папках, я не могу найти эту ситуацию. Это ВСЕГДА показывает, что у них есть доступ для чтения (возможность чтения файла в папке), хотя они явно не имеют.

Что я делаю не так? Ниже я комментирую настройки отладки для человека, изображенного выше.

internal bool IsListOnlyUser(string userID, string pth, bool IncludeInherited)
{
    DirectoryInfo di = new DirectoryInfo(pth);
    DirectorySecurity ds = di.GetAccessControl(AccessControlSections.Access);

    AuthorizationRuleCollection acl = ds.GetAccessRules(true,
            IncludeInherited, typeof(NTAccount));

    foreach (FileSystemAccessRule ace in acl)
    {
        if (ace.IdentityReference.Value.ToString().ToLower() 
            == userID.ToLower())
        {
            FileSystemRights R2 = ace.FileSystemRights;

            // *** The rights for the user with LIST only are:
            //FileSystemRights.ReadData (same value as ListDirectory)
            //FileSystemRights.ReadExtendedAttributes
            //FileSystemRights.ExecuteFile (same value as Traverse)
            //FileSystemRights.ReadAttributes
            //FileSystemRights.ReadPermissions
            //FileSystemRights.Synchronize

            bool L = CheckRights(ace, FileSystemRights.ListDirectory);

            bool R = CheckRights(ace, FileSystemRights.Read);
            // Yet, this resolves to TRUE! But I tested. This guy does NOT 
            // have access to the files themselves. Only to the fact that 
            // the file exists.

            bool W = CheckRights(ace, FileSystemRights.Modify);
            // This still resolves to FALSE

            if (L && !R && !W)
            {
                return true;
            }
        }
    }

    return false;
}

private bool CheckRights(FileSystemAccessRule ACE, FileSystemRights fileSystemRights)
{
    bool r = ((ACE.FileSystemRights & fileSystemRights) == fileSystemRights) &&
        (ACE.AccessControlType == AccessControlType.Allow);

    return r;
}

UPDATE

В качестве примечания: «IncludeInherited» всегда ложно в моем тестировании, но эта проблема остается верной, независимо от того, каким образом я поворачиваю флаг наследования.

1 Ответ

0 голосов
/ 13 декабря 2011

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

...