系统相关
首页 > 系统相关> > Windows如何解决冲突的文件系统权限?

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

作者:互联网

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

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

如果用户本身被拒绝了读取内容的权利,但是在允许该权限的组中,该怎么办呢?

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

解决方法:

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

The system examines each ACE in sequence until one of the following events occurs:

An access-denied ACE explicitly denies any of the requested access rights to one of the trustees listed in the thread’s access token.

One or more access-allowed ACEs for trustees listed in the thread’s access token explicitly grant all the requested access rights.

All ACEs have been checked and there is still at least one requested access right that has not been explicitly allowed, in which case, access is implicitly denied.

还按照标准顺序显示DACL中的ACE,如Order of ACEs in a DACL中所述.如果权限是由内置Windows工具设置的,则ACE将以此顺序排列,这就是您获取规则的方式Esteban在其答案(see referenced article)中进行了描述.但是,请注意,DACL不必遵循此标准.应用程序可以设置不设置的DACL,尽管这样做通常是不明智的,因为它会使Windows GUI混淆.

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

使事情复杂化的还有其他规则,例如对象的所有者隐式授予了READ_CONTROL和WRITE_DAC,并且在典型的访问令牌中还有其他受托人(例如INTERACTIVE),与组成员身份无关.

通常,正确的行为不是试图确定您拥有什么访问权限,而是简单地尝试您想采取的任何操作并在错误失败时进行处理. (尤其要注意,访问文件可能会由于访问权限以外的原因而失败,例如由于文件正在被另一个进程使用.)

但是,在极少数情况下确实需要确定适用的访问权限,则可以使用AuthzAccessCheck()功能来确定. (不建议使用和不准确的)GetEffectiveRightsFromAcl()函数的文档中提供了示例代码.

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

标签:security,permissions,file-permissions,windows,c
来源: https://codeday.me/bug/20191119/2037972.html