C# Windows如何解决文件系统权限/权限冲突?
在Windows安全系统中,一个用户可以属于多个组,一个组可以包含其他组。Windows中解决冲突权限的“规则”是什么 例如,假设一个用户在组a和组B中。组a对文件具有“拒绝读取”,而组B具有“允许读取”。用户可以读取该文件吗 如果用户本身被拒绝了读取某些内容的权限,但该用户所在的组中明确允许该权限,该怎么办 虽然我知道如何通过AccessRules及其公开的权限获取特定文件系统资源的权限,但由于这些规则针对的是特定的标识引用,可能是用户或组,因此我看到了冲突,并试图确定逻辑以确定“谁赢” …或者,是否有一种已知的方式说“让我获得此用户的所有权利,同时考虑任何会员资格”,并让系统对此感到担忧?(我很惊讶我还没有找到确切的答案。我正在做的工作似乎太多了。)C# Windows如何解决文件系统权限/权限冲突?,c#,windows,security,permissions,file-permissions,C#,Windows,Security,Permissions,File Permissions,在Windows安全系统中,一个用户可以属于多个组,一个组可以包含其他组。Windows中解决冲突权限的“规则”是什么 例如,假设一个用户在组a和组B中。组a对文件具有“拒绝读取”,而组B具有“允许读取”。用户可以读取该文件吗 如果用户本身被拒绝了读取某些内容的权限,但该用户所在的组中明确允许该权限,该怎么办 虽然我知道如何通过AccessRules及其公开的权限获取特定文件系统资源的权限,但由于这些规则针对的是特定的标识引用,可能是用户或组,因此我看到了冲突,并试图确定逻辑以确定“谁赢” …或
var Identity=WindowsIdentity.GetCurrent();
var fileInfo=newfileinfo(@“C:\Code\Path\To\Some\File.txt”);
//获取此用户(用户及其组)的所有身份引用
var identityReferences=new HashSet();
identityReferences.Add(Identity.User);
foreach(Identity.Groups中的var组)
identityReferences.Add(组);
//获取此特定文件信息上此用户的所有规则
var fileSystemAccessRules=fileInfo.GetAccessControl()
.GetAccessRules(true、true、typeof(SecurityIdentifier))
第()类
.Where(rule=>identityReferences.Contains(rule.IdentityReference));
FileSystemRights allowedUserRightsMask=0;
FileSystemRights deniedUserRightsMask=0;
//获得所有授权和所有拒绝规则的掩码
foreach(fileSystemAccessRules中的var fileSystemAccessRule)
{
var ruleRights=fileSystemAccessRule.FileSystemRights;
var relevantUserRightsMask=(fileSystemAccessRule.AccessControlType==AccessControlType.Allow)
?允许用户权限掩码
:deniedUserRightsMask;
relevantUserRightsMask |=规则权限;
}
//在此处对最终用户权限掩码执行某些操作。
权限优先级中概述的内容如下:
有关这一点的更多详细信息,请参阅文章。优先级由ACE的顺序决定,如MSDN中奇怪的名称所述: 系统按顺序检查每个ACE,直到发生以下事件之一: 拒绝访问ACE明确拒绝对线程访问令牌中列出的其中一个受信任者的任何请求访问权限 线程的访问令牌中列出的一个或多个允许受托人访问的ACE显式授予所有请求的访问权限 已检查所有ACE,但仍至少有一个请求的访问权限未被明确允许,在这种情况下,访问将被隐式拒绝 DACL中的ACE也有一个标准的显示顺序,如中所述。如果权限是由内置Windows工具设置的,则ACE将按此顺序排列,这就是如何获得Esteban在其回答中描述的规则。但是,请注意,DACL不必遵循此标准。应用程序可以设置一个不需要的DACL——尽管这样做通常是不明智的,因为它会混淆Windows GUI (请注意,某些API可能会自动将ACL中的ACE重新排序为标准顺序;如果需要保留ACL中ACE的实际顺序,请确保使用的API不会这样做。) 使事情复杂化的是,还有其他规则,例如对象的所有者具有隐式授予的
READ\u CONTROL
和WRITE\u DAC
,并且在典型的访问令牌中存在与组成员身份无关的额外受托人,例如INTERACTIVE
通常,正确的行为不是试图确定您拥有什么访问权限,而是简单地尝试您想要采取的任何操作,并在错误失败时处理错误。(尤其要记住,对文件的访问可能由于访问权限以外的原因而失败,例如,文件正被另一个进程使用。)
但是,在极少数情况下,如果确实需要确定适用的访问权限,则可以使用函数来确定。示例代码位于(已弃用且不准确)函数的文档中
(我对.NET不太熟悉,无法确定它是否包含内置的等效项;我猜它没有。但是,如果需要,您可以p/Invoke。)通常,如果用户属于具有“允许读取”的任何组,则该用户可以凭借该特权进行读取。您所谓的“拒绝读取”可能更好地被认为是“不允许读取”。这意味着此组权限不足以允许它,但它不会阻止其他组权限允许它。这是重点的微妙变化。我还应该声明,Unix上肯定会发生这种情况;Windows上的规则可能不同-这是一个评论而不是答案的主要原因。实际上,我的意思是拒绝阅读。您所说的“不允许读取”意味着没有明确的“允许读取”规则,但这是明确的“拒绝读取”规则。该规则的AccessControlType为Deny,并且已读取该规则。我只是添加了代码来说明我的意思。我的问题是,如果我得到一组的拒绝读取和另一组的允许读取,谁赢了;那么,我与Unix的并行性不足以帮助您或我。你得等另一个c
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.