使用命令行给文件夹下的所有内容设置完全访问或完全禁止访问权限(针对任何用户)

网上说用cacls或icacls可以设置ntfs权限,后者貌似是前者的加强版。于是在cmd里简单的看了下这两个命令的帮助,帮助里建议不要使用cacls,于是我尝试使用icacls。

正好icacls帮助里面举了几个实际例子,其中有两个是备份还原ACL,我一想,这省事了,我直接在GUI界面先设置好完全访问或完全禁止访问权限,然后分别备个份,用的时候直接还原不就行了。

备份完全访问权限没有问题,可备份完全禁止访问权限就不行了,提示禁止访问,我略一想就明白了,我把当前用户所有的权限都禁了,当然就无法读取ntfs权限了。怎么办呢?我想要不不设置完全禁止,而是允许读取权限,结果不行,知道后来我把“遍历文件夹/执行文件”和“列出文件夹/读取数据”两个也允许了才能备份,但这等于没有禁止访问啊。

那就换个办法,不备份还原权限了,直接设置权限得了,这个应该也不难觉得。

结果上网一查,帖子倒是不少,试了半天,被坑惨了。

命令如下

赋予everyone用户目录(z:\test)及其下文件和文件夹(递归)的完全访问权限:
icacls z:\test /grant:r everyone:(F) /t
这个没有问题

拒绝everyone用户目录(z:\test)及其下文件和文件夹(递归)的访问权限:
icacls z:\test /deny everyone:(F) /t
这条命令无法完成任务

具体分析:此命令使用时只能拒绝对z:\test文件夹本身的访问权限,对文件夹下面的所有内容都不起作用,会提示"z:\test\*: 拒绝访问"。一开始我还没明白怎么回事,后来才想通,/t在帮助中的解释是更改当前目录及其所有子目录中指定文件的ACL,也就是说,假设test目录有一个目录,目录中又有一个文件,那么实际上这条命令的执行对象是三个,即两个目录,一个文件。执行顺序是先从test开始,执行了test后,再对内含的文件和目录执行命令时,系统就会认为权限不足(估计是因为父目录被禁止访问了,就不能设置内部内容的权限了),此时就会提示拒绝访问,那么实际上这条命令的最终执行目标只有一个,那就是test,其余目标的权限保持不变。

那么该怎么办呢,可以使用下面这条命令
icacls z:\test /remove:g everyone
  - 删除授予该用户的对目录test的所有权限(如果test文件夹中内容的权限是继承于test,那么这些继承的权限也同时会删除)

但是如果test文件夹中内容的权限不是继承于test,这条命令就不管用了。而且这种方式和显式的设置拒绝权限不同,其他授过权的用户还是可以访问的。如果遇到这种情况,又该怎么办呢,这时我突然想到我在gui里面设置一个文件夹下所有内容权限的方式,那就是继承,即设置父对象的权限,然后勾选“使用可从此对象继承的权限替换所有子对象权限”。如果命令行也能使用继承方式设置权限,就可以解决问题了。

icacls z:\test /deny everyone:(OI)(CI)(F)
上面这条命令我没测试过,估计不会有问题,设置之后应该任何用户都没有访问权限了。

另外,也可以用继承的方法设置完全控制权限
icacls z:\test /grant:r everyone:(OI)(CI)(F)
- 授予用户对目录test及其下所有内容完全控制权限(注意这里使用了继承参数,所以不需要/t参数,命令成功执行的话会显示“已成功处理一个文件”,就是指test文件夹。至于文件夹中的内容会继承test的权限)

下面是一些值得注意的地方

1.注意输入命令时参数的顺序不要输错了

2.指定权限操作路径时,指定z:\test的话(和指定z:\test\等价)权限操作目标是test目录本身,指定z:\test\*的话权限操作目标是test目录下的文件和文件夹,不操作test目录本身。如果加上/t就会包括递归向下的目标。

3.相关缩写解释。
  ACE - Acess Control Entry(访问控制项)
  ACL - Access Control List(访问控制列表)
 
  ACL是由一系列ACE组成
  ACL分为两种,DACL和SACL,DACL管制对象访问,SACL管制审核。

  DACL - Discretionary access control list(自主访问控制列表)
  DACL - 存储用户或组对NTFS文件或文件夹拥有的相应的NTFS权限,用来控制用户对NTFS文件和文件夹的访问。

  SACL - System access control list(系统访问控制列表)
  SACL - 存储NTFS文件或文件夹的审计设置,用来跟踪和记录用户或组对NTFS文件所执行操作或访问意图。

4.
  /grant sid:perm
  赋予指定SID访问权限,相当于gui操作时勾选允许复选框,之前已经选中的允许复选框保持不变
 
  /grant:r sid:perm
  替换指定SID的访问权限,相当于gui操作时先取消选中之前已经选中的所有允许复选框,再重新勾选允许复选框
 
  /deny sid:perm
  显式拒绝指定SID的访问权限,相当于gui操作时勾选拒绝复选框
 
  /remove:g sid
  删除授予该SID的所有权限,相当于gui操作时取消选中之前已经选中的所有允许复选框

  /remove:d sid
  删除拒绝该SID的所有权限,相当于gui操作时取消选中之前已经选中的所有拒绝复选框

5.CI - 容器继承(容器应该是指目录)
  OI - 对象继承(对象应该是指文件)
  这两个参数在icacls中的使用待会后面会提到,同时使用这两个参数应该相当于gui高级设置中选中“使用可从此对象继承的权限替换所有子对象权限”复选框

6.网上说权限实际上是跟SID绑在一起的,而SID是唯一的(即使同名用户实际上的SID也不相同),所以假设你的硬盘设置了唯一的一个用户访问权限,将拿到别人的电脑上,而别人的电脑上也有和你同名的用户,别人仍然读取不了你硬盘上的数据。

7.权限掩码(不包括继承权限)之间以逗号分隔,并用括号括起来,单个权限可以使用括号括起来也可以不用
  继承权限优先于权限掩码,每个继承权限单独用括号括起来,写在权限掩码的前面
  下面是几个示例

  icacls filename /grant:r everyone:(D,WDAC)
  - 授予用户对文件删除和写入 DAC 的权限

  icacls z:\test /grant:r everyone:(OI)(CI)F
  或
  icacls z:\test /grant:r everyone:(OI)(CI)(F)
  - 授予用户对目录test及其下所有内容完全控制权限(注意这里使用了继承参数,所以不需要/t参数,命令成功执行的话会显示“已成功处理一个文件”,就是指test文件夹。至于文件夹中的内容会继承test的权限)

8.我已经试验过了,对于
  icacls z:\test /grant:r everyone:(OI)(CI)(F)
  重复执行这条命令不会引起什么异常,对于
  icacls z:\test /remove:g everyone
  也一样。

下面是一些和cacls命令有关的东西,正如开头所说的,不建议使用这条命令

1.输入命令时参数的顺序不能输错,如果输错了,不会提示错误,但会显示帮助,等于输入了caclc /?的效果

2.和icacls唯一不同的是,路径指定z:\test的后面不能加上反斜杠,否则命令无法执行(cmd不会报错,就是什么也不做,等着你重新输入命令)

3./g 赋予指定用户访问权限,相当于gui操作时勾选允许复选框,之前已经选中的允许复选框保持不变,相当于icacls命令的/grant参数
  /p 替换指定用户的访问权限,相当于gui操作时先取消选中之前已经选中的所有允许复选框,再重新勾选允许复选框,相当于icacls命令的/grant:r参数
  /d 显式拒绝指定的用户访问权限,相当于gui操作时勾选拒绝复选框
  /r 撤销指定用户的访问权限,相当于gui操作时删除某个用户

4.使用/e选项执行命令不会提示确认

5.下面这条命令
 
  cacls z:\test /e /r everyone
  
  和

  icacls z:\test /remove:g everyone
  - 删除授予该用户的对目录test的所有权限(如果test文件夹中内容的权限是继承于test,那么这些继承的权限也同时会删除)
  
  的执行结果是不同的,前者只会删除用户对test文件夹的权限,但用户对test文件夹中所有内容的权限不会变(即使这些权限是继承自test文件夹)。

此条目发表在 ., 运维与网管 分类目录。将固定链接加入收藏夹。

使用命令行给文件夹下的所有内容设置完全访问或完全禁止访问权限(针对任何用户)》有 1 条评论

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>