2015-09-26 2 views
3

В системе безопасности 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. 
+1

Обычно, если пользователь принадлежит к любой группе, которая имеет «Разрешить чтение», тогда пользователю разрешено читать в силу этой привилегии. То, что вы называете «Deny Read», возможно, лучше рассматривать как «Не разрешать чтение». Это означает, что этого разрешения группы недостаточно для его разрешения, но он не блокирует разрешения других групп. Это тонкая смена акцента. Я также должен сказать, что это то, что происходит в Unix для уверенности; правила могут быть разными в Windows - основная причина - комментарий, а не ответ. –

+0

На самом деле, я имею в виду Deny Read. То, что вы указали «Не разрешать чтение», означало бы отсутствие явного правила «Разрешить чтение», но это явное правило «Запретить чтение». Правило имеет AccessControlType of Deny, а правило - Чтение. Я просто добавил код, чтобы показать, что я имею в виду. Мой вопрос: если я получу Deny Read для одной группы и Allow Read от другого, кто победит? – MarqueIV

+0

OK; то моя параллель с Unix недостаточна, чтобы помочь вам или мне. Вам придется подождать кого-то, кто может вам помочь. –

ответ

1

Приоритет определяется порядком АСЯ, как описан в странном имени How AccessCheck Works в MSDN:

Система не проверяет каждый ACE в последовательности, пока один из следующих событий:

ACE с запретом доступа явно отказывает в любом запрошенном праве доступа одному из доверенных лиц, указанному в токене доступа потока.

Один или несколько разрешенных ACE для доверенных лиц, перечисленных в токене доступа к потоку, явно предоставляют все запрашиваемые права доступа.

Все проверки ACE были проверены, и по-прежнему существует хотя бы одно запрошенное право доступа, которое явно не разрешено, и в этом случае доступ неявно отклоняется.

Существует также стандартный порядок, в котором должны присутствовать ACE в DACL, как описано в Order of ACEs in a DACL. Если разрешения были установлены встроенными инструментами Windows, ACE будут в этом порядке, то есть как вы получите правила, описанные Эстебаном в его ответе (see referenced article). Обратите внимание, однако, что DACL не имеют, чтобы следовать этому стандарту. Приложения могут устанавливать DACL, который этого не делает, хотя обычно это неразумно делать, потому что это смущает графический интерфейс Windows.

(Обратите внимание, что некоторые API могут автоматически переупорядочить ACE в ACL стандартным порядком, если вам нужно сохранить фактический порядок ACE в ACL, убедитесь, что вы используете API, который этого не делает.)

Усложняет дело, есть также дополнительные правила, такие, как тот факт, что владелец объекта имеет READ_CONTROL и WRITE_DAC неявно предоставляется, и что существуют дополнительные доверенные лица, такие как INTERACTIVE в типичном маркер доступа, не относящийся к группе членство.

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

Однако, в редких случаях, когда вам действительно нужно для определения соответствующих прав доступа вы можете сделать это, используя функцию AuthzAccessCheck(). Пример кода доступен в документации по функции (устаревшая и неточная) GetEffectiveRightsFromAcl().

(я не достаточно хорошо знаком с .NET, чтобы убедиться, содержит ли он встроенный эквивалент;. Я думаю, что это не Тем не менее, вы можете P/Invoke, если это необходимо.)

+0

Это именно то, что я искал. Благодаря! :) – MarqueIV

2

Как указано в Understanding Windows NTFS Permissions разрешения старшинства выглядит следующим образом:

  1. Явные Запретить
  2. Явные Разрешить
  3. Наследуется Запретить
  4. Наследуется Разрешить

Итак, чтобы ответить на ваш вопрос: это зависит. Явный отказ всегда имеет приоритет; унаследованный запрет, однако, «теряет» до явного разрешения.

См. Статью для получения более подробной информации о последствиях этого.

+1

Интересная статья, тем более что она не находится на сайте Microsoft, что выходит за рамки разочарования! НО, что в стороне, как я могу узнать, унаследовано ли право или явным? Правило просто говорит «Разрешить» или «Отказать». Еще лучше, есть ли какой-то API, который я могу вызвать/использовать, который делает все это для меня, где я могу просто сказать «Учитывая ресурс X и пользователя Y, разрешения следующие. .? Если да, обновите свой ответ фрагментом кода, и я дам вам ответ. – MarqueIV

+0

Также, Inherited, похоже, ссылается на иерархию папок. Но как это затрагивает мой вопрос, различающийся между разрешениями пользователей и групп? – MarqueIV

+0

@MarqueIV Я чувствую, что я ответил на ваш оригинальный вопрос. Вы уже знаете, как получить разрешения, поэтому я не уверен, что вы имеете в виду. Вы получаете ACL, и вам решать, что с ним делать. Если вам интересно, действительно ли ОС позволит вам выполнить какое-либо действие, вы можете просто попробовать его поймать исключение безопасности. Что ты пытаешься сделать? –

 Смежные вопросы

  • Нет связанных вопросов^_^