2013-08-21 111 views
0

假設我有一個包含許多嵌套子目錄的目錄myDir樹。我授予完全訪問此目錄及其所有文件和嵌套子目錄到myUser與命令:如何從批處理文件中的cacls處理中排除子目錄

cacls myDir /T /E /G myUser:F

到目前爲止,這麼好。

現在我有一個子目錄myDir/A/B/C,我想從cacls處理中排除。也就是說,我不想授予myUser訪問此子目錄。

你會建議什麼?

最簡單的方法就是在運行cacls之前將此文件夾移動到另一個地方並在此之後將其移回。是否有意義?

+0

你有沒有嘗試過呢? – captcha

+0

另一種解決方案是添加第二個命令,從文件夾中刪除「myuser」訪問權限。 – foxidrive

回答

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 
3

繼承的文件夾權限都顯示爲:

OI - 對象繼承 - 此文件夾和文件。 (沒有繼承到子文件夾)
CI - 容器繼承 - 此文件夾和子文件夾。
IO - 僅繼承 - ACE不適用於當前文件/目錄

這些可以組合爲folllows:
(OI)(CI)此文件夾,子文件夾和文件。
(OI)(CI)(IO)僅子文件夾和文件。
(CI)(IO)僅子文件夾。
(OI)(IO)僅文件。

所以BUILTIN \管理員:(OI)(CI)F表示,這兩個文件和子目錄將繼承 'F'(Fullcontrol)
類似(CI)R意味着目錄將繼承 'R'(只讀文件夾=列表權限)

要改變一個文件夾/目錄的繼承使用iCACLS /grantiCACLs /deny

+0

問題是關於如何讓cacls在處理整個樹時不會佔據特定文件夾的權限。 權限是在每個對象上設置的,並且繼承不是自動的。只需設置要繼承的權限不會更改任何現有子級的權限 - 它基本上只是用作創建新子級時使用的默認ACL模板。 – joeking

相關問題