【windows 访问控制】四、访问控制项ACE
访问控制项


具体内容 : https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ifs/access-control-entry
访问控制条目(ACE)是访问控制列表(ACL)中的元素。一个ACL可以包含零个或多个ACE。每个ACE控制或监视指定受托者(Trustees)对对象的访问。
ACE有六种类型,所有安全对象都支持其中三种。其他三种类型是目录服务对象支持的特定于对象的ACE.
所有类型的ACE都包含以下访问控制信息:
- 安全标识符(SID),用于标识ACE适用于的受托者
- 一个访问掩码(Access Mask),该掩码指定了具体的访问权限(Access Rights),也就是可以对该对象执行的操作(此掩码非常重要,后续很多漏洞会用到)
- 一个位标记,指示ACE类型的标志。拒绝(deny)还是允许(allow)
- 一组位标志,指示了安全描述符所属对象的子对象是否继承这个ACE。访问控制项

DACL中的ACE顺序
当进程尝试访问安全对象时,系统逐步浏览该对象的任意访问控制列表(DACL)中的访问控制项(ACE),直到找到允许或拒绝所请求访问的ACE。 DACL允许用户的访问权限可能会根据DACL中ACE的顺序而有所不同。因此,Windows XP操作系统在安全对象的DACL中为ACE定义了首选顺序。首选顺序提供了一个简单的框架,可确保拒绝访问的ACE实际上拒绝访问。上一节已经对该顺序有过介绍。
对于Windows Server 2003和Windows XP,引入特定于对象的ACE和自动继承会使得ACE的正确顺序变得复杂。
以下步骤描述了首选顺序:
1、对于继承的ACE的每个级别,将拒绝访问的ACE放置在允许访问的ACE之前。
2、另外,并不是ACL中需要所有ACE类型
3、将所有显式ACE(即手动设置的ACE)放在一个组中,然后放在任何继承的ACE之前。
4、在显式ACE组中,拒绝访问的ACE放置在允许访问的ACE之前。
5、继承的ACE按照继承的顺序放置。从子对象的父对象继承的ACE首先出现,然后是从祖父母那里继承的ACE,依此类推。
ACE继承
对象的ACL可以包含从其父容器继承的ACE。例如,注册表子项可以从注册表层次结构中位于其上方的项继承ACE。同样,NTFS文件系统中的文件可以从包含该文件的目录继承ACE。
ACE的ACE_HEADER结构(该结构见本节最后一小节)包含一组继承标志,这些继承标志控制ACE继承以及ACE对它所连接的对象的影响。系统根据ACE继承规则解释继承标志和其他继承信息。
这些规则通过以下功能得到增强:
1、支持自动传播可继承的ACE。
2、 一个标志,用于区分继承的ACE和直接应用于对象的ACE。
3、 特定于对象的ACE,允许指定可以继承ACE的子对象的类型。
4、 通过将除SYSTEM_RESOURCE_ATTRIBUTE_ACE和SYSTEM_SCOPED_POLICY_ID_ACE之外的安全描述符的控制位中的SE_DACL_PROTECTED或SE_SACL_PROTECTED位设置来防止DACL或SACL继承ACE的能力。
自动传播可继承的ACE
SetNamedSecurityInfo和SetSecurityInfo函数支持可继承访问控制项(ACE)的自动传播。例如,如果使用这些功能将可继承的ACE添加到NTFS中的目录,则系统会将ACE适当地应用于任何现有子目录或文件的访问控制列表(ACL)。
直接应用的ACE优先于继承的ACE。系统通过将直接应用的ACE放在任意访问控制列表(DACL)中继承的ACE之前来实现此优先级。当调用SetNamedSecurityInfo和SetSecurityInfo函数设置对象的安全信息时,系统会将当前继承模型强加于目标对象下方层次结构中所有对象的ACL上。对于已转换为当前继承模型的对象,在对象的安全描述符的控制字段中设置SE_DACL_AUTO_INHERITED和SE_SACL_AUTO_INHERITED位。
当构建一个反映当前继承模型的新安全描述符时,注意不要更改安全描述符的语义。因此,允许和拒绝ACE绝不会彼此相对移动。如果需要进行此类移动(例如,将所有非继承的ACE放在ACL的前面),则将该ACL标记为受保护,以防止语义更改。
将继承的ACE传播到子对象时,系统使用以下规则:
1、如果自动继承导致从子对象的DACL中删除所有ACE,则子对象具有空的DACL,而不是没有DACL。
2、如果没有DACL的子对象继承了ACE,则结果是带有DACL的子对象仅包含继承的ACE。
3、如果带有空DACL的子对象继承了ACE,则结果是带有DACL的子对象仅包含继承的ACE。
4、如果从父对象中删除可继承的ACE,则自动继承将删除子对象继承的ACE的所有副本。
这些规则可能会产生意外结果,即将没有DACL的对象转换为具有空DACL的对象。没有DACL的对象允许完全访问,但是具有空DACL的对象不允许访问。作为这些规则如何创建空DACL的示例,假设将可继承的ACE添加到对象树的根对象。自动继承将可继承的ACE传播到树中的所有对象。现在,没有DACL的子对象具有带有继承的ACE的DACL。如果从根对象中删除可继承的ACE,则系统会自动将更改传播到子对象。现在,没有DACL(允许完全访问)的子对象具有空的DACL(不允许访问)。
为确保没有DACL的子对象不受继承ACE的影响,在对象的安全描述符中设置SE_DACL_PROTECTED标志。
C# 新建一个ACE 代码如下:
方式一、
FileSecurity sonFileSecurity=sonFile2.GetAccessControl();
sonFileSecurity.AddAccessRule(new FileSystemAccessRule("HP", FileSystemRights.Modify, AccessControlType.Deny));
sonFile2.SetAccessControl(sonFileSecurity);

方式二、
FileSystemAccessRule ace =new FileSystemAccessRule("HP",FileSystemRights.Write,InheritanceFlags.ContainerInherit,PropagationFlags.InheritOnly,AccessControlType.Allow);
DirectorySecurity ds= substrDir1.GetAccessControl();
ds.AddAccessRule(ace);
substrDir1.SetAccessControl(ds);
"HP":表示账户名,也可以是IdentityReferenc类型
InheritanceFlags.ContainerInherit:指定继承给目录,如果要继承给文件和目录请用InheritanceFlags.ObjectInherit
PropagationFlags.InheritOnly:这个是配合InheritanceFlags一起用的。构成

【windows 访问控制】四、访问控制项ACE的更多相关文章
- 【windows安全性 之访问控制】 访问控制 详细解说
windows的安全性的两个基本支柱是身份验证(登入)和授权(访问控制). 身份验证是标识用户的过程 ,授权在验证了所标识用户是否可以访问特定资源之后进行. 相关的命名空间和类: System.Sec ...
- 关于Windows下的访问控制模型
在探索Windows操作系统的过程中,发现很多有意思 的东西. Windows下的访问控制模型也是我在Github上浏览代码时,无意中发现的. 项目地址 https://github.com/Krut ...
- [Windows Phone] 地图控制项的经纬度
原文:[Windows Phone] 地图控制项的经纬度 前言 本文主要示范如何使用地图经纬度以及显示地标和行人街道,并透过卷轴控制地图缩放比例的功能. ? 实作 step1 建立专案. ? step ...
- Windows Server 2016-配置Windows Defender防病毒排除项
Windows Server 2016 的计算机上的 Windows Defender 防病毒自动注册你在某些排除项,由你指定的服务器角色定义. 这些排除项不会显示在Windows 安全中心应用中所示 ...
- Windows Phone 四、控件模版
控件模版的概念 Windows Phone中每一个控件都有一个默认的模版,用于描述控件的内部组成结构和外观样式 相对于原本的样式外观操作,自定义模版的可自定义性更强 最基本的重写控件模版 <Gr ...
- 安装centos 7后恢复windows 2008R2 (Windows7)启动项
安装CentOS 7,安装之后发现Win2008R2的启动项不见了(Windows7同理).一般安装Linux过程中会自动识别windows系统并添加引导项,centos的问题在于默认不支持ntfs分 ...
- Windows的四类消息
Windows的三类消息1.标准消息宏名称 对映消息 消息处理函数(名称已由系统预设)ON_WM_CHAR WM_CAHR OnCharON_WM_CLOSE WM_CLOSE OnCloseON_W ...
- windows添加开机启动项
http://www.cnblogs.com/jokey/archive/2010/06/17/1759370.html添加开机启动项(通过注册表) 例子:增加QQ开机启动项 第一步:找到注册表的启动 ...
- Nginx访问控制_IP访问控制(http_access_module)原理、局限性、解决方法讲解
基于IP的访问控制,基于Nginx的http_access_module模块,是Nginx本身内置的模块,不需要安装的时候配置.也就是允许哪些IP访问,不允许哪些IP访问 server { liste ...
随机推荐
- Apple历代Mac系统汇总
编号 系统名 版本号 名称 发布时间 01 macOS 11.0 Big Sur(大惊喜) 2020年6月 02 macOS 10.15 Catalina(卡特琳娜) 2019年9月 03 macOS ...
- 002 Linux 文件与目录命令的必会姿势!
01这些命令真的很重要吗? 文件及目录的路径切换.显示.创建.复制.移动和删除操作的常用姿势,必会!因为这些命令是使用 Linux 系统进行工作的基础,是摆脱小白的第一步,是构建大厦的基石! 发现锅锅 ...
- Android 12(S) 图形显示系统 - createSurface的流程(五)
题外话 刚刚开始着笔写作这篇文章时,正好看电视在采访一位92岁的考古学家,在他的日记中有这样一句话,写在这里与君共勉"不要等待幸运的降临,要去努力的掌握知识".如此朴实的一句话,此 ...
- 「BalkanOI 2018 Day1」Minmaxtree
「BalkanOI 2018 Day1」Minmaxtree 每个点都有一个最大和最小权值的限制. 然后每一个权值的限制都必须要取到. 每个点显然可以直接让他取到最大或最小权值. 可以想到每个点匹配一 ...
- Swift数组
数组的介绍 数组(Array)是一串有序的由相同类型元素构成的集合 数组中的集合元素是有序的,可以重复出现 Swift中的数组 swift数组类型是Array,是一个泛型集合 数组的初始化 数组分成: ...
- Python property动态属性
from datetime import datetime, date class User: def __init__(self, name, birthday): self.name = name ...
- PMD的使用学习
是什么? 静态代码分析器 能找出什么问题? 可能的 bugs - 空的 try/catch/finally/switch 声明 死码 - 未使用的本地变量,参数和私有方法 次优代码 - 无用的 Str ...
- sql作业题
作业题:1.查询选修课程'3-105'且成绩在60到80之间的所有记录.注释:用于指定某个范围使用between and,也可以使用and连接符;答案:法1:select * from sc wher ...
- redis lua脚本学习
语法格式(常见) a = 5 -- 全局变量 local b = 5 -- 局部变量 Eval的使用 EVAL script numkeys key [key ...] arg [arg ...] 首 ...
- nginx负载均衡中常见的算法及原理有哪些?
一.nginx负载均衡常用算法 1.1 轮询 轮询,nginx默认方式.一次将请求分配给各个后台服务器. upstream backserver { server 10.0.0.7; server 1 ...