admin管理员组

文章数量:1585963

        要查看或设置文件或文件夹的ACL,我们通常可以在图形界面通过打开文件或文件夹的安全属性页来实现。除此之外,Windows也提供了功能强大的命令行工具:icacls.exe可用来查看或修改文件或文件夹的ACL。它不仅可以修改ACL中的权限设置,还可以备份和恢复ACL,与图形界面相比,它最大的优势在于可以高效地进行批量操作。

        1.参数信息

        icacls.exe可以操作文件系统对象(文件和文件夹)的ACL,各参数及意义如下。

设置DACL中的内容icacls.exe <文件名> /setowner <用户名>  [/t] [/c] [/l] [/q]
将所有匹配文件的所有者设置为指定用户。该命令不会强制更改文件所有者,如需强制更改,可使用takeown.exe。
icacls.exe <文件名> /grant[:r] <sid>:<权限>[...]
该命令向指定的用户授权。如果使用":r",这些权限将替换所有现有的显式向该用户授予的权限,否则这些权限将被追加到现有的向该用户授予的权限。
icacls.exe <文件名> /deny <sid>:<权限>[...]
该命令显式地拒绝指定用户享有列出的权限。该命令会在DACL中加入一条针对sid的拒绝ACE,该ACE包含了命令中列出的权限,DACL中原有的向该用户授予这些权限的允许ACE会被删除这些权限。
icacls.exe <文件名> /remove[:g|:d] <sid>[...]  [/t] [/c] [/l] [/q]
该命令在DACL中删除列出的所有SID。如果使用":g",则删除授予该sid的所有权限;如果使用":d",则删除拒绝该sid的所有权限。
icacls.exe <文件名> /setintegritylevel [(CI)|(OI)] <级别>:<策略>[...] 
该命令向所有匹配的文件显式地添加完整性ACE,级别为以下级别之一:
L[ow]
M[edium]
H[igh]
完整性ACE的继承选项可以优先于完整性级别,但只适用于目录。
icacls.exe <文件名> /inheritancelevel:[e|d|r]
该命令设置文件的ACE继承属性。
e: 启用继承
d: 禁用继承并复制ACE
r: 禁用继承并删除所有继承的ACE
icacls.exe <目录名> /substitue <sidold><sidnew>[...] 
该命令将所有的现有sidold替换成sidnew。该命令必须结合目录名使用。
DACL的备份与恢复icacls.exe <文件名> /save <ACL文件> [/t] [/c] [/l] [/q]
该命令将匹配文件的DACL存储到文件中,以便将来用/restore选项将其恢复到文件中。该命令不保存SACL、文件所有者以及完整性信息等内容。
icacls.exe <目录名> /restore <ACL文件> [/c] [/l] [/q]
该命令用于将之前存储的ACL文件应用到指定目录的文件中。该命令必须与<目录名>结合使用。
icacls.exe <文件名> /reset [/t] [/c] [/l] [/q]
该命令将所有匹配文件的ACL替换成默认继承的ACL。
按要求查找文件icacls.exe <文件名> /findsid <sid> [/t] [/c] [/l] [/q]
在所有匹配文件中查找DACL中含有指定SID的文件。
icacls.exe <文件名> /verify  [/t] [/c] [/l] [/q]
在所有匹配文件中查找其DACL不健全或者其ACE计数与实际ACE数量不一致的文件。

对于各命令的参数需要再进一步解释一下:

文件名可以用通配符匹配多个文件。
[/t] 在当前目录及其下所有子目录的文件上执行操作
[/c] 即使出现错误也不中断命令的执行。会给出错误信息。
[/l] 如果文件是符号链接,那么在该链接上执行操作,而不是在其所指向的文件上。
[/q] 不显示成功消息。
sid可以采用数字格式或名称格式,如果使用数字格式,要在开头使用"*"字符。
icacls.exe在操作DACL时会维护ACE的首选顺序,见(再聊Windows的访问控制(二))

命令中的<权限>是权限掩码,可以指定两种格式之一:
        简单权限序列:
                N - 无访问权限
                F - 完全访问权限
                M - 修改权限
                RX - 读取和执行权限
                R - 只读权限
                W - 只写权限
                D - 删除权限
        在括号中以逗号分隔的特定权限列表:
                DE - 删除
                RC - 读取控制
                WDAC - 写入 DAC
                WO - 写入所有者
                S - 同步
                AS - 访问系统安全性
                MA - 允许的最大值
                GR - 一般性读取
                GW - 一般性写入
                GE - 一般性执行
                GA - 全为一般性
                RD - 读取数据/列出目录
                WD - 写入数据/添加文件
                AD - 附加数据/添加子目录
                REA - 读取扩展属性
                WEA - 写入扩展属性
                X - 执行/遍历
                DC - 删除子项
                RA - 读取属性
                WA - 写入属性
        继承权限可以优先于每种格式,但只应用于目录:
                (OI) - 对象继承
                (CI) - 容器继承
                (IO) - 仅继承
                (NP) - 不传播继承
                (I) - 从父容器继承的权限

2.演示        

        下面我们设计了一个简单的方案。电脑上有两个账户,分别是stdusr和user2,它们都是标准用户,不具备管理员权限。我们用stdusr运行命令设置文件夹或文件对user2的权限,用user2的身份测试效果。

        我用stdusr创建了一个文件夹MyDir,再在其下创建一个文本文件MyFile.txt,我们就用这个简单的目录结构来演示。

        1)查看ACL

        首先我们以最简单的形式运行icacls.exe。如果只输入该命令名,会给出该命令的帮助信息。我们在其后跟上文件系统对象的名字,就可以查看它的ACL信息。

        该命令对于文件和文件夹给出的信息是有区别的。在上面的对文件夹MyDir输出信息中,每行都代表DACL中的一条ACE。回忆我们在《再聊Windows的访问呢控制(Access Control)(三)》中提到的,当某容器对象继承来自父对象的ACE时,如果既将其继承为自身的有效ACE,又希望其被下级子对象继续继承,在ACE含有通用信息的情况下,该容器对象会继承两条ACE,一条作为有效ACE作用于容器对象自身,其中的通用信息被具体化,另一条为只继承ACE,保留通用信息不变,用于支持下级对象继续继承。由于MyDir是一个容器对象,所以我们看都每个安全主体都有两条ACE,一条是在该文件夹被具体化的,另一条是包含通用信息留待下级对象具体化的。(OI)和(CI)标记分别表示该ACE可被下级的文件和文件夹继承,这两个标记专用于文件夹,大家可回顾《再聊Windows的访问呢控制(Access Control)(三)》中提到的OBJECT_INHERIT_ACE和CONTAINER_INHERIT_ACE标志。

        如果我们查看文件的DACL,就是只继承一条ACE了:

大家可结合前面的权限说明核实每个安全主体被赋予的权限。

        2)备份ACL

        由于改变文件或文件夹的访问权限是一项敏感的操作,要象操作注册表那样小心,所以提前对ACL进行备份是必要的。在进行进一步的测试之前我们先用/save命令将MyDir的ACL备份到ACL_MyDir文件,最后我们还要用它恢复。

3)权限的授予和继承的设置

        为了演示权限增减效果,我们删除文件夹从上级容器对象继承的ACE,因为这些ACE会产生我们不需要的授权。

        但在这之前我们先演示一下如何向指定安全主体授予权限,在这里我们向Users组授予读写权限,之所以先做这一步是因为这些对ACE的修改操作仍然会用到继承ACE的授权,如果先删除继承的ACE这些操作就会失败。

        这样我们显式地加入了一条允许Users组对MyDir及其下级对象读写的ACE,足够我们后面的使用了,现在我们可以删除继承的ACE了。

        /inheritancelevel:r的含义禁止从上级容器对象继承ACE,并删除现有的继承ACE,我们对MyDir运行该命令,为后面的演示创造条件。

        我们看到现在只剩下一条显式向Users组授权的ACE,继承的ACE都被删除了。

        由于user2账户也是Users组的成员,所以用该账户登录可以修改MyDir下的文件。

4.对指定的安全主体拒绝某权限。

        通常我们无需明确地指定拒绝某特定安全主体行驶某权限,因为只要不对其授予权限,就默认为对其拒绝该权限了。但如果对某一个组授予了某权限,有需要对其中个别成员拒绝该权限,这是可明确地设置一条ACE拒绝该成员行使权限。

        现在user2用户属于Users组,具有对MyDir的读写权限,我们可以对User2增加一条拒绝其写权限的ACE,观察效果。

        可以看出,DACL中多了一条拒绝User2写的ACE,我们用User2登录观察一下效果:

可以看出,user2被成功地阻止对文件的写入操作。

5.删除对某安全主体的授权信息

        要恢复User2的写权限,我们可以用/remove子命令移除涉及user2的AC,该命令可以移除针对指定安全主体的安全设定:

        我们已经删除了拒绝user2写入的ACE,user2又恢复了写入能力。我们再用User2账户登录看能不能恢复写权限:

        可以看到,正如我们预料的一样,成功地向MyFile.txt又写入了一行。

6.管理对象的强制完整性(MIC)。

        强制完整性是Windows Vista/Windows Server 2008开始推出的一层附加的访问控制机制,我们在本系列的(四)中做了简单介绍。

        现在我们用管理账户(需先向其授权)将MyDir及其下级内容的完整性级别设置为高(h),然后向user2赋予完全访问(F)权限,可以看到,即使user2具有完全访问权限,由于MyDir的完整性级别为高,要想访问其内容,User2也必须经过权限提升才能访问。

        用管理员将MyDir的完整性级别提升为h:

向User2赋予完全访问权限后,再向MyFile.txt写入内容仍需权限提升。

拒绝访问:

权限提升后:

7.重置ACL

/reset子命令可以将ACL重置为从上级容器对象继承ACE的状态。

要测试该命令,需要先将撤销刚才设置的高级完整性级别。

将MyDir的ACL设置为从上级容器对象继承ACE的初始状态:

可以看到,现在MyDir的ACE已经和刚刚创建时一样,只有从上级容器对象继承来的ACE。

8.恢复之前备份的ACL

现在从开始时备份的ACL文件中恢复ACE,这需要用管理员权限才能操作。

        至此我们已将ICACLS命令的常用功能做了简单演示,剩余几个选项大家可自行设计方案测试。

        在工作环境中规划文件服务器或其他文件共享机制时,可以将设计需求落实到脚本中,这样在配置时或进行灾难恢复时可以正确又快速地恢复系统配置,不用再在图形界面使用键鼠逐个操作。icacls命令就是脚本中的核心部分,熟练使用该命令是非常有用的。

本文标签: 访问控制Windows再聊Accessexe