圖形介面 (右鍵屬性→安全性) 設定權限直觀但效率低、難以批次/自動化。命令列工具 **Cacls** (舊)、**Xcacls** (資源工具包增強版)、**ICacls** (Vista/Win 7+ 內建現代標準) 能在腳本、遠端管理、無人值守安裝、權限修復中發揮不可替代的作用。本文系統講解三代工具語法、參數、實戰範例與避坑指南。
語法: `CACLS 檔案/資料夾路徑 [/T] [/E] [/C] [/G 使用者:權限] [/R 使用者...] [/P 使用者:權限...] [/D 使用者...]`
| 參數 | 說明 |
|---|---|
| (無參數) | 顯示指定路徑 ACL |
| /T | 遞歸處理目前目錄及所有子目錄/檔案 |
| /E | 編輯 ACL (而非替換),**保留現有 ACE** |
| /C | 遇到「拒絕存取」錯誤繼續處理下一個 |
| /G 用戶:權限 | 授予指定使用者權限 (權限: R/W/C/F) |
| /R 用戶 | 撤銷指定使用者存取權限 (**需配合 /E**) |
| /P 用戶:權限 | 替換指定使用者權限 (權限含 N=無) |
| /D 用戶 | 明確拒絕指定使用者存取 (產生 Deny ACE) |
# 1. 查看權限
cacls C:\Data
# 2. 遞歸授予 Users 群組 讀取/執行 權限 (編輯模式,保留原有)
cacls C:\Data /T /E /C /G Users:R
# 3. 遞歸授予 Administrators 完全控制
cacls C:\Data /T /E /C /G Administrators:F
# 4. 撤銷 User1 的權限 (需 /E)
cacls C:\Data /T /E /C /R User1
# 5. 明確拒絕 Guest 存取
cacls C:\Data /T /E /C /D Guest
# 6. 批次處理系統關鍵檔案 (需極度謹慎!)
cacls.exe C:\Windows\System32\net.exe /C /E /T /G Administrators:F
cacls.exe C:\Windows\System32\dllcache\net.exe /C /E /T /G Administrators:F
# ... 類似操作給 SYSTEM、Administrator、Everyone 完全控制 (風險極高,僅修復權限損壞時使用)
微軟官方增強工具,功能接近 ICacls,但部署麻煩 (需安裝 Resource Kit 或單獨複製 exe),現已被 ICacls 取代。**了解即可,實戰建議直接用 ICacls。**
關鍵增強: 支援 `/Y` (抑制確認提示,適合批次)、`/G` 含 `S` (特殊/自訂權限)、繼承旗標控制 (CI/OI/IO/NP)。
語法: `ICACLS 路徑 [/grant[:r] 用戶:權限] [/deny 用戶:權限] [/remove[:g|:d] 用戶] [/setintegritylevel Level] [/inheritance:e|d|r] [/T] [/C] [/L] [/Q]`
| 參數 | 說明 |
|---|---|
| /grant 用戶:權限 | 授予權限 (保留現有 ACE)。權限可用簡寫 (F,M,RX,R,W,D) 或具體存取權 (OI)(CI)F |
| /grant:r 用戶:權限 | **替換**該用戶現有 ACE (而非新增) |
| /deny 用戶:權限 | 明確拒絕權限 (產生 Deny ACE,優先級最高) |
| /remove 用戶 | 移除該用戶所有 ACE (Allow+Deny) |
| /remove:g 用戶 | 僅移除 Allow ACE |
| /remove:d 用戶 | 僅移除 Deny ACE |
| /T | 遞歸處理子目錄/檔案 |
| /C | 繼續處理錯誤 (忽略拒絕存取) |
| /Q | 安靜模式 (不顯示成功訊息) |
| /L | 對符號連結本身操作而非目標 |
| /inheritance:e|d|r | e=啟用繼承、d=停用繼承並複製現有 ACE、r=移除所有繼承 ACE |
# 1. 查看完整 ACL (含繼承旗標)
icacls C:\Data
# 2. 遞歸授予 "Users" 群組 "讀取和執行" (此資料夾、子資料夾、檔案繼承)
icacls C:\Data /grant Users:(OI)(CI)RX /T /C /Q
# 3. 遞歸授予 "Administrators" 完全控制 (替換現有 ACE,確保乾淨)
icacls C:\Data /grant:r Administrators:(OI)(CI)F /T /C /Q
# 4. 遞歸授予 "SYSTEM" 完全控制
icacls C:\Data /grant:r SYSTEM:(OI)(CI)F /T /C /Q
# 5. 明確拒絕 "Guest" 所有存取
icacls C:\Data /deny Guest:(OI)(CI)F /T /C /Q
# 6. 移除 "OldUser" 所有 ACE (Allow+Deny)
icacls C:\Data /remove OldUser /T /C /Q
# 7. 停用繼承並複製現有 ACE 為顯性 ACE (斷開繼承鏈,獨立管理)
icacls C:\Data /inheritance:d /T /C /Q
# 8. 啟用繼承 (移除所有顯性 ACE,恢復從父系繼承)
icacls C:\Data /inheritance:e /T /C /Q
# 9. 移除所有繼承 ACE (保留顯性 ACE,斷開繼承)
icacls C:\Data /inheritance:r /T /C /Q
# 10. 取得擁有權 (配合 takeown)
takeown /F C:\Data /R /D Y
icacls C:\Data /grant Administrators:(OI)(CI)F /T /C /Q
# 11. 重設為預設權限 (系統預設繼承 + 明確 ACE)
icacls C:\Data /reset /T /C /Q
# 12. 備份/還原 ACL (極其實用!)
icacls C:\Data /save ACL_Backup.txt /T /C # 備份至文字檔
icacls C:\Data /restore ACL_Backup.txt # 還原 (需相同路徑結構)
# 以管理員身分執行
icacls C:\Windows /reset /T /C /Q
icacls C:\Program Files /reset /T /C /Q
icacls C:\Program Files (x86) /reset /T /C /Q
icacls C:\Users /reset /T /C /Q
# 配合 sfc /scannow、DISM 修復更完整
# 需求: 共享資料夾 D:\Share
# Administrators: 完全控制
# BackupOperators: 修改 (讀寫刪)
# Users: 讀取和執行 (唯讀)
# Guest: 拒絕存取
icacls D:\Share /grant:r Administrators:(OI)(CI)F /T /C /Q
icacls D:\Share /grant:r "Backup Operators":(OI)(CI)M /T /C /Q
icacls D:\Share /grant:r Users:(OI)(CI)RX /T /C /Q
icacls D:\Share /deny Guest:(OI)(CI)F /T /C /Q
# 停用繼承並複製 (確保不受父系干擾)
icacls D:\Share /inheritance:d /T /C /Q
@echo off
set TARGET=D:\AppData
set LOG=%TARGET%\ACL_Set.log
echo [%(date%) %(time%)] Starting ACL configuration... > %LOG%
takeown /F %TARGET% /R /D Y >> %LOG% 2>&1
icacls %TARGET% /grant:r Administrators:(OI)(CI)F /T /C /Q >> %LOG% 2>&1
icacls %TARGET% /grant:r SYSTEM:(OI)(CI)F /T /C /Q >> %LOG% 2>&1
icacls %TARGET% /grant:r Users:(OI)(CI)RX /T /C /Q >> %LOG% 2>&1
icacls %TARGET% /inheritance:d /T /C /Q >> %LOG% 2>&1
echo [%(date%) %(time%)] Completed. >> %LOG%
現代管理首選 PowerShell `Get-Acl`、`Set-Acl`、`icacls` 仍可在 PS 中直接呼叫。
# 取得 ACL 物件
$acl = Get-Acl C:\Data
# 定義新規則 (允許 Users 讀取執行,繼承)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Users","ReadAndExecute","ContainerInherit,ObjectInherit","None","Allow")
$acl.AddAccessRule($rule)
# 套用
Set-Acl C:\Data $acl
# 移除規則
$acl.RemoveAccessRule($rule)
Set-Acl C:\Data $acl
**ICacls 是現代 Windows 管理 NTFS 權限的命令列標準**。掌握 `/grant:r` (替換授予)、`/deny` (拒絕)、`/remove` (移除)、`/inheritance:d|e|r` (繼承控制)、`/T` (遞歸)、`/save|/restore` (備份還原) 核心參數,配合 `takeown` 取得擁有權,即可應對 99% 權限管理場景:從共享資料夾精細授權、系統權限修復、自動化部署腳本、到頑固檔案強制接管。拋棄 Cacls/Xcacls,擁抱 ICacls (與 PowerShell ACL 物件),讓權限管理從「點點點」進化為「碼碼碼」。