【发布时间】: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 的对比不足以帮助你或我。您必须等待其他可以帮助您的人。
标签: c# windows security permissions file-permissions