如何从批处理文件中的cacls处理中排除子目录

时间:2013-08-21 15:33:17

标签: windows batch-file cacls

假设我有一个目录myDir树,其中有许多嵌套的子目录。我使用以下命令授予对此目录的完全访问权限及其所有文件和嵌套子目录myUser

cacls myDir /T /E /G myUser:F

到目前为止,这么好。

现在我有一个子目录myDir/A/B/C,我想从cacls处理中排除它。也就是说,我不想授予myUser访问此子目录的权限。

你会建议什么?

最简单的方法是在运行cacls之前将此文件夹移动到另一个位置,然后再将其移回。是否有意义?

2 个答案:

答案 0 :(得分:3)

继承的文件夹权限显示为:

OI - 对象继承 - 此文件夹和文件。 (没有子文件夹的继承)
CI - 容器继承 - 此文件夹和子文件夹 IO - 仅继承 - ACE不适用于当前文件/目录

这些可以合并为下列:
(OI)(CI)此文件夹,子文件夹和文件 (OI)(CI)(IO)仅子文件夹和文件      (CI)(IO)仅子文件夹。
(OI)(IO)仅文件。

所以BUILTIN \管理员:(OI)(CI)F表示文件和子目录都将继承'F'(Fullcontrol)
类似(CI)R表示目录将继承'R'(仅读取文件夹=列表权限)

要实际更改文件夹/目录的继承,请使用iCACLS /grantiCACLs /deny

答案 1 :(得分:1)

您需要生成要处理的文件列表,并排除您不想要的文件,因为CACLS不允许过滤。

在这里,我使用“dir”生成要处理的文件列表。 你也可以使用“forfiles”。

(您可以使用管道使脚本更紧凑,但我使用临时文件只是为了使其更清晰)。

@echo off
setlocal

set TMPFILE=%TEMP%\dirs.txt
set TMPFILE2=%TEMP%\dirs2.txt

@rem Generate the list of dir names to be processed
dir "%~1" /ad /s /b /p > %TMPFILE%

@rem Filter out the unwanted ones
findstr /i /v /C:"myDir\A\B\C" < %TMPFILE% > %TMPFILE2%

@rem And execute a command on each
for /F "delims=;" %%x in (%TMPFILE2%) do call :dostuff "%%x"

goto :EOF

:dostuff
    @rem do the directory itself
    cacls "%~1\ /E /G myUser:F

    @rem do the files
    cacls "%~1\*" /E /G myUser:F

    goto :EOF