Я написал сегмент кода для проверки папок со следующими настройками разрешений:
Обратите внимание, что у пользователя нет функций чтения и выполнения, чтения и т. Д. Все, что у него есть, это «Список содержимого папки». И это так, как нам нужно.
Однако, когда я сканирую этого конкретного пользователя в этих папках, я не могу найти эту ситуацию. Это ВСЕГДА показывает, что у них есть доступ для чтения (возможность чтения файла в папке), хотя они явно не имеют.
Что я делаю не так? Ниже я комментирую настройки отладки для человека, изображенного выше.
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» всегда ложно в моем тестировании, но эта проблема остается верной, независимо от того, каким образом я поворачиваю флаг наследования.