Windows如何解决冲突的FileSystem权限/权限?

时间:2015-09-26 03:16:07

标签: c# windows security permissions file-permissions

在Windows的安全系统中,用户可以属于多个组,一个组可以包含其他组。在Windows中如何解决冲突权限的“规则”是什么?

例如,假设用户在A组中,也在B组中。组A对文件具有“拒绝读取”,而“B组”具有“允许读取”。用户可以读取文件吗?

如果用户本身被拒绝阅读某些内容的权利,但该内容是在明确允许该权限的群组中怎么办?

虽然我知道如何通过AccessRules及其公开的权限获取特定FileSystem资源的权限,但由于规则针对的是可能是用户或组的特定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.

2 个答案:

答案 0 :(得分:2)

如{{3}}中所述,权限优先权如下:

  1. 明确拒绝
  2. 明确允许
  3. 继承拒绝
  4. 继承允许
  5. 所以,回答你的问题:这取决于你。显式拒绝总是优先;然而,继承的否认,“失败”到明确允许。

    有关此含义的详细信息,请参阅文章。

答案 1 :(得分:1)

优先级由ACE的顺序决定,如MSDN中奇怪命名的How AccessCheck Works中所述:

  

系统按顺序检查每个ACE,直到发生以下事件之一:

     

拒绝访问的ACE明确拒绝对线程访问令牌中列出的其中一个受托者的任何请求的访问权限。

     

线程访问令牌中列出的受托者的一个或多个允许访问的ACE明确授予所有请求的访问权限。

     

已检查所有ACE,并且仍然至少有一个未明确允许的请求访问权限,在这种情况下,隐式拒绝访问。

还有一个标准顺序,其中应显示DACL中的ACE,如Order of ACEs in a DACL中所述。如果权限已由内置Windows工具设置,则ACE将按此顺序排列,这就是Esteban在其答案(see referenced article)中描述的规则。但请注意,DACL 不符合此标准。应用程序可以设置一个没有的DACL - 虽然这样做通常是不明智的,因为它会混淆Windows GUI。

(请注意,某些API可能会自动将ACL中的ACE重新排序为标准顺序;如果您需要在ACL中保留ACE的实际顺序,请确保使用的API不会执行此操作。)< / p>

为了使问题复杂化,还有其他规则,例如对象的所有者隐式授予READ_CONTROLWRITE_DAC,以及{{1}等其他受托人在典型的访问令牌中,与组成员身份无关。

通常,正确的行为是而不是来尝试确定您拥有的访问权限,而是简单地尝试您要采取的任何操作,并在错误时处理错误。 (特别是,请记住,对文件的访问可能因访问权限以外的原因而失败,例如因为该文件正由另一个进程使用。)

但是,在您确实需要确定适用的访问权限的极少数情况下,您可以使用AuthzAccessCheck()功能执行此操作。示例代码可在(不建议使用的)GetEffectiveRightsFromAcl()函数的文档中找到。

(我对.NET不太熟悉,以确定它是否包含内置的等价物;我猜它不会。但是,如果需要,你可以进行P / Invoke。)