В системе безопасности Windows пользователь может принадлежать многим группам, а группа может содержать другие группы. Каковы «правила» разрешения конфликтов в Windows?Как Windows разрешает конфликтующие права/права на FileSystem?
Например, пользователь находится в группе A, а также в группе B. Группа A имеет «Запретить чтение» в файле, а «Группа B» имеет «Разрешить чтение». Может ли пользователь прочитать файл?
Что делать, если пользователю было отказано в правах на чтение чего-либо, но оно находится в группе, где это разрешение явно разрешено?
Хотя я знаю, как получить разрешения для определенного ресурса FileSystem через AccessRules и права, которые они раскрывают, поскольку правила нацелены на определенный IdentityReference, который может быть пользователем или группой, я видел конфликты и пытаюсь определить логику, чтобы выяснить, кто победит.
... или есть известный способ сказать: «Получите мне все права для этого пользователя, также принимая во внимание любые членства», и пусть система беспокоится об этом? (.. Я удивлен, что я не нашел точно, что уже что я делаю кажется ужасно много работы)
var Identity = WindowsIdentity.GetCurrent();
var fileInfo = new FileInfo(@"C:\Code\Path\To\Some\File.txt");
// Get all identity references for this user (user's and it's groups)
var identityReferences = new HashSet<IdentityReference>();
identityReferences.Add(Identity.User);
foreach(var group in Identity.Groups)
identityReferences.Add(group);
// Get all rules for this user on this specific FileInfo
var fileSystemAccessRules = fileInfo.GetAccessControl()
.GetAccessRules(true, true, typeof(SecurityIdentifier))
.OfType<FileSystemAccessRule>()
.Where(rule => identityReferences.Contains(rule.IdentityReference));
FileSystemRights allowedUserRightsMask = 0;
FileSystemRights deniedUserRightsMask = 0;
// Get mask of all granted, and all denied rules
foreach(var fileSystemAccessRule in fileSystemAccessRules)
{
var ruleRights = fileSystemAccessRule.FileSystemRights;
var relevantUserRightsMask = (fileSystemAccessRule.AccessControlType == AccessControlType.Allow)
? allowedUserRightsMask
: deniedUserRightsMask;
relevantUserRightsMask |= ruleRights;
}
// Do something with the final user rights mask here.
Обычно, если пользователь принадлежит к любой группе, которая имеет «Разрешить чтение», тогда пользователю разрешено читать в силу этой привилегии. То, что вы называете «Deny Read», возможно, лучше рассматривать как «Не разрешать чтение». Это означает, что этого разрешения группы недостаточно для его разрешения, но он не блокирует разрешения других групп. Это тонкая смена акцента. Я также должен сказать, что это то, что происходит в Unix для уверенности; правила могут быть разными в Windows - основная причина - комментарий, а не ответ. –
На самом деле, я имею в виду Deny Read. То, что вы указали «Не разрешать чтение», означало бы отсутствие явного правила «Разрешить чтение», но это явное правило «Запретить чтение». Правило имеет AccessControlType of Deny, а правило - Чтение. Я просто добавил код, чтобы показать, что я имею в виду. Мой вопрос: если я получу Deny Read для одной группы и Allow Read от другого, кто победит? – MarqueIV
OK; то моя параллель с Unix недостаточна, чтобы помочь вам или мне. Вам придется подождать кого-то, кто может вам помочь. –