Windows 如何解决冲突的文件系统权限/权限?

Posted

技术标签:

【中文标题】Windows 如何解决冲突的文件系统权限/权限?【英文标题】:How does Windows resolve conflicting FileSystem permissions/rights? 【发布时间】:2015-12-23 22:35:05 【问题描述】:

在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.

【问题讨论】:

通常,如果用户属于具有“允许读取”的任何组,则凭借该权限允许用户读取。您所说的“拒绝阅读”可能更好地被视为“不允许阅读”。这意味着该组权限不足以允许它,但它不会阻止其他组权限允许它。这是重点的微妙变化。我还应该指出,这肯定是在 Unix 上发生的; Windows 上的规则可能有所不同——这是评论而非答案的主要原因。 实际上,我的意思是拒绝阅读。你所说的“不允许阅读”意味着没有明确的“允许阅读”规则,但这是一个明确的“拒绝阅读”规则。该规则的 AccessControlType 为 Deny,并且规则为 Read。我只是添加了代码来说明我的意思。我的问题是,如果我得到一个组的拒绝读取和另一个组的允许读取,谁会赢? 好的;那么我与 Unix 的对比不足以帮助你或我。您必须等待其他可以帮助您的人。 【参考方案1】:

如Understanding Windows NTFS Permissions中所述权限优先级如下:

    明确拒绝 显式允许 继承拒绝 继承允许

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

有关此影响的更多详细信息,请参阅文章。

【讨论】:

有趣的文章,尤其是因为它不在微软的网站上,这真是令人沮丧!但是,除此之外,我如何判断一项权利是继承的还是明确的?规则只是说“允许”或“拒绝”更好的是,是否有一些我可以调用/使用的 API 可以为我完成所有这些,我可以简单地说“给定资源 X 和用户 Y,权限如下.. .'?如果是这样,请使用代码 sn-p 更新您的答案,我会给您答案。 另外,Inherited 似乎是指文件夹层次结构。但这如何解决我在用户和组权限之间存在差异的问题? @MarqueIV 我觉得我已经回答了你原来的问题。您已经知道如何获得权限,所以我不确定您的意思。您将获得 ACL,并由您决定如何处理它。如果您想知道操作系统是否真的会让您执行某个操作,您可以尝试捕获安全异常。你想做什么? 对不起,我不同意。请重新阅读我的问题。我特别举了一个例子,两个不同的组在单个资源上具有冲突的权限。 AuthorizationRule 类的.isInherited 属性告诉您规则是继承的还是显式的。【参考方案2】:

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

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

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

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

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

如Order of ACEs in a DACL 中所述,DACL 中的 ACE 也应出现标准顺序。如果权限已由内置 Windows 工具设置,则 ACE 将按此顺序排列,这就是 Esteban 在他的回答 (see referenced article) 中描述的规则的方式。但是请注意,DACL 没有必须遵循此标准。应用程序可以设置一个不这样做的 DACL - 尽管这样做通常是不明智的,因为它会混淆 Windows GUI。

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

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

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

但是,在您确实需要确定适用的访问权限的极少数情况下,您可以使用AuthzAccessCheck() 函数来完成。有关(已弃用且不准确)GetEffectiveRightsFromAcl() 函数的文档中提供了示例代码。

(我对 .NET 不够熟悉,无法确定它是否包含内置等效项;我猜它没有。但是,如果需要,您可以 P/Invoke。)

【讨论】:

这正是我想要的。谢谢! :)

以上是关于Windows 如何解决冲突的文件系统权限/权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何提升windows7的权限

linux文件经 windows系统 之后出现 权限缺失 的解决方法

解决电脑管理员权限才能删除此文件的办法

如何提升windows7的权限

Windows文件服务器共享的时候分配权限对于目录深文件量大的情况下,权限写入非常慢,有啥办法可以解决

在Windows中遇到文件权限不够,无法保存修改?下面几步教你轻松解决