假设我有一个myDir
包含许多嵌套子目录的目录树。我通过以下命令授予对该目录及其所有文件和嵌套子目录的完全访问权限myUser
:
cacls myDir /T /E /G myUser:F
到目前为止,一切都很好。
myDir/A/B/C
现在我有一个我想从cacls
处理中排除的子目录。也就是说,我不想授予myUser
对该子目录的访问权限。
你有什么建议?
最简单的方法是在运行之前将此文件夹移动到另一个位置,然后再将cacls
其移回。是否有意义?
假设我有一个myDir
包含许多嵌套子目录的目录树。我通过以下命令授予对该目录及其所有文件和嵌套子目录的完全访问权限myUser
:
cacls myDir /T /E /G myUser:F
到目前为止,一切都很好。
myDir/A/B/C
现在我有一个我想从cacls
处理中排除的子目录。也就是说,我不想授予myUser
对该子目录的访问权限。
你有什么建议?
最简单的方法是在运行之前将此文件夹移动到另一个位置,然后再将cacls
其移回。是否有意义?
继承的文件夹权限显示为:
OI - 对象继承 - 此文件夹和文件。(不继承子文件夹)
CI - 容器继承 - 此文件夹和子文件夹。
IO - 仅继承 - ACE 不适用于当前文件/目录
这些可以组合为以下内容:
(OI)(CI) 此文件夹、子文件夹和文件。
(OI)(CI)(IO) 仅子文件夹和文件。
(CI)(IO) 仅子文件夹。
(OI) (IO) 仅文件。
所以 BUILTIN\Administrators:(OI)(CI)F 意味着文件和子目录都将继承 'F' (完全控制),
同样 (CI)R 意味着目录将继承 'R' (只读文件夹 = 列出权限)
要实际更改文件夹/目录的继承,请使用iCACLS /grant
或iCACLs /deny
您需要生成要处理的文件列表并排除您不想要的文件,因为 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