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

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

例如,假设一个用户在A组和B组中.A组在文件上有“拒绝读取”,而“B组”有“允许读取”。 用户可以读取文件吗?

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

虽然我知道如何通过访问规则和它们公开的权限获得特定文件系统资源的权限,但由于规则的目标是可能是用户或组的特定的IdentityReference,我已经看到了冲突,并试图确定逻辑找出“谁赢”。

…还是有一种已知的方式来说'给我这个用​​户的所有权利,也考虑到任何成员',让系统担心呢? (我很惊讶,我还没有find那个,我正在做的事情似乎是很多工作。)

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. 

优先级由ACE的顺序决定,正如MSDN中奇怪的AccessCheck工作原理所述:

系统依次检查每个ACE,直到发生以下事件之一:

拒绝访问的ACE明确拒绝任何对线程访问令牌中列出的受托人之一的访问权限。

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

所有的ACE都被检查过了,至少还有一个请求的访问权限没有被明确的允许,在这种情况下,访问被隐式地拒绝。

还有一个DACL中的ACE应该出现的标准顺序,如DACL中ACE的顺序所述 。 如果权限是由内置的Windows工具设置的,ACE将按照这个顺序,这就是你如何得到Esteban在他的答案中描述的规则(参见参考文章) 。 但是请注意,DACL不必遵循这个标准。 应用程序可以设置一个DACL,虽然这样做通常是不明智的,因为它混淆了Windows GUI。

(请注意,某些API可能会自动将ACL中的ACE重新排序为标准顺序;如果您需要在ACL中保留ACE的实际顺序,请确保您使用的API不会这样做)。

更复杂的是,还有一些附加的规则,比如对象的所有者隐式地授予了READ_CONTROLWRITE_DAC ,并且在典型的访问令牌中还有额外的受托者,例如INTERACTIVE ,与组成员资格无关。

通常情况下,正确的行为并不是试图确定你拥有什么样的访问权限,而是简单地尝试你想要采取的任何行动,如果失败则处理错误。 (尤其要记住的是,访问文件可能会因访问权限以外的原因而失败,例如因为该文件正在被另一个进程使用。)

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

(我对.NET不太了解,以确定它是否包含一个内置的等价物;我猜测它没有,但是,如果需要的话,可以使用P / Invoke)。

正如理解Windows NTFS权限的优先级所述,如下所示:

  1. 显式拒绝
  2. 显式允许
  3. 继承Deny
  4. 继承允许

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

请参阅文章,了解更多关于这个问题的细节。