Windows如何解决冲突的文件系统权限?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Windows如何解决冲突的文件系统权限?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3358字,纯文字阅读大概需要5分钟。
内容图文
![Windows如何解决冲突的文件系统权限?](/upload/InfoBanner/zyjiaocheng/947/1e1411ce1fc14d53b795f4e3ecb8b2b7.jpg)
在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.)
内容总结
以上是互联网集市为您收集整理的Windows如何解决冲突的文件系统权限?全部内容,希望文章能够帮你解决Windows如何解决冲突的文件系统权限?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。