開始前先了解
先準備 NTFS 資料磁碟與本機低權限帳號 tutorial-reader. 它不應是 Administrators 成員. 示例資料夾是 D:\TutorialAccess, 請換成自己的空白測試位置; 不修改磁碟根目錄, Windows, 使用者設定檔或正式網站的權限.
全程保留系統管理員與 SYSTEM 的必要管理權限, 並保留另一個可管理主機的登入方式. 本篇只討論本機 NTFS 存取, 不建立網路共用或網域授權.
本系列使用 Windows Server 2022 Datacenter 繁體中文真實操作畫面. 帳號, 網路設定, 磁碟與示範數值請換成自己的環境; 選項名稱可能因版本與語言不同而異.
01建立專用資料夾與測試內容
以系統管理員建立 D:\TutorialAccess 與無害的 example.txt. 資料夾若已存在或含重要資料, 請改用另一個空白測試位置, 不直接套用本篇步驟.
確認 tutorial-reader 是本機帳號, 並核對它所屬的群組. NTFS 權限會受到帳號及其群組授權共同影響, 不能只看帳號名稱那一列.
接下來只改這個測試資料夾. 操作前先記錄現有權限與可復原方式, 不把其他資料夾的權限當成可以直接複製的範本.
New-Item D:\TutorialAccess -ItemType Directory
'Tutorial read-only sample' |
Set-Content D:\TutorialAccess\example.txt
Get-LocalUser -Name tutorial-reader
icacls D:\TutorialAccess
放大圖片
02查看繼承來源並保留原設定
在檔案總管開啟資料夾內容的安全性頁面, 再進入進階權限設定. 查看目前擁有者, 權限項目與繼承來源, 分清從上層繼承的項目與直接設定的項目.
變更前可將這個測試資料夾的 DACL 存到資料夾外. 下方只保存此資料夾及測試內容的存取清單, 不是檔案內容備份, 也不包含所有擁有者或稽核設定.
保存後先確認檔案存在. 若發現權限與預期不同, 先停止並釐清用途, 不直接以重設整顆磁碟的方式處理.
New-Item C:\TutorialLab -ItemType Directory -Force
Push-Location D:\
icacls TutorialAccess /save C:\TutorialLab\TutorialAccess-before.acl /t
Pop-Location
Get-Item C:\TutorialLab\TutorialAccess-before.acl
放大圖片
03停用繼承並授予指定帳號讀取權限
只針對 D:\TutorialAccess 停用繼承, 選擇把既有繼承項目轉成明確權限的方式. 不要選擇一次移除全部繼承項目後才尋找管理帳號.
確認 Administrators 與 SYSTEM 仍保有完全控制. 然後核對 Users 等一般群組在這個測試資料夾的允許項目, 移除會讓測試帳號取得額外寫入能力的廣泛授權; 不修改整個群組或上層磁碟.
新增本機 tutorial-reader 的允許項目, 只授予讀取與執行所需權限, 不授予修改或完全控制. 核對套用範圍包含本資料夾, 子資料夾與檔案.
本次演練由管理員透過 PowerShell 套用 ACL, 儲存變更後重新讀取並核對最終清單. 截圖顯示繼承防護與實際權限, 不是從 GUI 送出變更的紀錄; 也可用前一步的安全性頁面檢查相同設定.
不要用拒絕 Everyone 來達成唯讀. 拒絕可能同時影響需要管理資料的帳號, 也會讓後續排查變得複雜. 如果無法確定某一項用途, 先保留並釐清.
放大圖片
04用低權限帳號實際測試讀寫
改用 tutorial-reader 的一般登入工作階段或以該帳號啟動的 PowerShell, 先執行 whoami 確認身分. 不要仍在管理員的提升權限視窗中測試後就判定一般帳號的結果.
先讀取 example.txt, 再嘗試建立全新的 should-not-exist.txt. 預期讀取成功, 新建檔案因權限不足被拒絕. 請核對錯誤原因確實是存取遭拒, 不是磁碟不存在或檔案原本已存在.
本次截圖由管理員讀回 tutorial-reader 實際執行後的結果記錄. 記錄顯示讀取成功, 寫入遭 System.UnauthorizedAccessException 拒絕; 測試身分為低權限帳號, 不是開啟結果視窗的管理員.
# 在 tutorial-reader 的一般 PowerShell 中執行
whoami
[IO.File]::ReadAllText("D:\TutorialAccess\example.txt")
[IO.File]::WriteAllText("D:\TutorialAccess\should-not-exist.txt", "write test")
放大圖片
05核對最終權限並保留復原方式
由管理員再次查詢資料夾與 example.txt 的 ACL. 確認資料夾已停用繼承, 管理員與 SYSTEM 仍具必要管理權限, tutorial-reader 為讀取與執行, 沒有另留下不必要的廣泛寫入授權. 同時確認 should-not-exist.txt 不存在, 避免只看錯誤訊息就判定測試完成.
有效存取查詢可協助判讀, 但實際帳號的測試仍不可省略. 若帳號還屬於其他有寫入權限的群組, 只有新增一條唯讀允許規則不會抵消那些授權.
若仍能寫入, 回頭檢查群組, 明確權限與子項目繼承. 需要復原時由管理員依原本保存位置還原 DACL, 並再次核對管理存取與測試帳號結果; 不對其他資料夾執行批次重設.
Get-Acl D:\TutorialAccess | Format-List Owner,AreAccessRulesProtected,AccessToString
icacls D:\TutorialAccess
icacls D:\TutorialAccess\example.txt
Test-Path D:\TutorialAccess\should-not-exist.txt
保留需要的測試結果後, 若要復原本篇 DACL, 由管理員依原存檔的相對路徑執行 icacls D:\ /restore C:\TutorialLab\TutorialAccess-before.acl. 先確認這份檔案確實只包含自己的測試資料夾, 不載入來路不明的 ACL 檔案.
放大圖片
完成後如何確認
本次以 tutorial-reader 的實際身分驗證 example.txt 讀取成功, 新建檔案被拒絕且 should-not-exist.txt 不存在. 最終資料夾只保留 Administrators 與 SYSTEM 的完全控制, 以及 tutorial-reader 的讀取與執行權限, 沒有繼承的存取項目. 本篇 DACL 保存與復原指令供操作前規劃使用, 不代表已完成資料內容的還原演練.
這個本機 NTFS 演練不等於已設定網路共用或正式網站的完整權限. 套用到其他資料時, 仍需依實際帳號, 群組與服務需求重新確認.
常見問題
我給帳號唯讀, 為什麼它仍可以寫入?
它可能同時屬於另一個具有寫入權限的群組, 或從上層繼承其他授權. 請核對有效權限與實際登入身分, 不要直接用拒絕 Everyone 取代排查.
保存 ACL 就等於已備份資料嗎?
不是. DACL 檔案保存存取清單, 不保存原始檔案內容. 正式資料仍需要內容備份與另外的還原演練.