如何使用 Icacls 命令管理文件权限

Icacls 是一個Windows 命令行工具,IT 管理員可以使用它來更改文件和文件夾上的存取控制清單。其中一個IT專業人員或系統管理員常常執行的任務是修改文件伺服器上的權限。使用 icacls 命令是一種非常有效的方法來完成這一點,我們將在本指南中解釋如何使用這個命令。

如何使用 icacls 命令

根據我自己的個人經驗,在 Windows 上修改文件權限通常是使用文件總管完成的。對於許多 IT 人員來說,打開文件總管,瀏覽造成一些使用者存取問題的網路位置,並將其權限從「讀取」變更為「讀取/修改」或類似的操作是非常直觀的。簡單快速,相當易於使用。

廣告

然而,在眾多涵蓋不同範圍的情況下,界面的功能卻並不像我們期望的那樣強大。如果我們要更改 2200 萬個文件和文件夾的權限,我們必須做對!

什麼是存取控制清單(ACL)?

在Windows和NTFS文件系统中,每个文件对象(文件夹)都有一个存取控制列表。此列表由存取控制条目(ACE)组成。列表包含所有对该文件对象具有某种权限级别的用户和/或其他安全容器对象(组等)。

什么是存取控制条目?稍等片刻…

什么是存取控制条目(ACE)?

存取控制条目(ACE)是控制用户/组对文件对象的各个权限级别的单独记录或权限规则。让我列出ACL可用的基本高级权限:

广告

  • 完全控制(F)
  • 修改控制(M)(包括“删除”)
  • 读取和执行控制(RX)
  • 只读访问(R)
  • 只写访问(W)

还有大约十几个“高级”权限,但超出了本文的范围。

文件资源管理器的限制

現在,如果我是微軟的檔案總管(File Explorer)程式經理(這不是我特別羨慕的工作),這些是我會新增的功能。相信我,我想要他們新增這些功能已經幾十年了!

假設你正在處理從伺服器A遷移至伺服器B的檔案伺服器遷移。你已經將資料複製到目的地(伺服器B)。你發現並非所有權限遞迴地看起來正確。

所以,你進入樹的根目錄,進入安全選項卡,對存取控制清單進行一些更改。你勾選框以遞迴修改根目錄下的所有2200萬個檔案和資料夾。它開始進行更改,然後向你彈出一些關於對系統檔案、唯讀檔案等進行更改的確認彈出視窗。

廣告

現在,這是我的要求 – 在他們可以創建的小型“嚮導”中,我想指定簡單地假設並點擊“是”以回應所有確認請求。然後,過程將繼續處理任何錯誤,然後在完成時向我提供摘要,並提供一個鏈接以下載檔案的原始輸出,以便我可以返回並檢查任何出現的錯誤或警告。

不,我不知道微軟是否會提供這樣一個美妙、強大、設定並忘記的功能集。因此,在此期間,我們轉向命令列和腳本的強大功能。這就是內建的icacls命令派上用場的地方。

了解icacls語法

icacls語法實際上非常直觀且相對容易學習。基本上,您使用命令,然後添加要檢查或操作的文件或文件夾,然後添加/更改/刪除權限。

當然也有命令行開關。我們將很快介紹所有這些。以下是當您運行以下命令然後輸入文件名時發生的情況的示例。

icacls Excellent.txt
Using icacls to view current permissions

它將每行輸出一個ACE,因此使用上面的示例:

  • 內建的“SYSTEM”帳戶具有繼承(I)和完全(F)訪問權限
  • 內建的管理員組具有相同的權限
  • 內建的使用者組具有繼承(I)、讀取(R)和執行(X)權限。

您可以在PowerShell中使用icacls嗎?

嗯,正如您可以從我的上面示例和屏幕截圖中看到的一樣,確實可以使用PowerShell來運行icacls命令。您只需要注意一些環境變量需要以稍微不同的方式引用。

在文件對象上查看和管理ACL的等效PowerShell cmdlet是Get-AclSet-Acl。這聽起來像是未來的發文主意!?

使用icacls來為文件或文件夾設置權限

因為icacls命令內建於Windows中,一旦你理解了這裡的基礎知識,你就可以自由地開始使用該命令。你也可以單獨在命令行上輸入’icacls’來查看可用的幫助信息。你也可以在這個頁面上瀏覽類似的Microsoft icacls命令文檔。在這裡

如何顯示對象的當前ACL

好了,我想這裡的解說就夠了…讓我們開始使用這個命令吧。要顯示文件或目錄的當前ACL,只需使用以下命令:

icacls file or directory
icacls Download
Using icacls to view permissions on a folder

這裡,“Download”是一個帶有文件和子文件夾的文件夾。正如你所看到的,對於目錄對象,輸出略有不同。你會看到(OI)和(CI),因為這些是專門適用於目錄的容器繼承級別權限。

對於內建管理員組,你會看到它擁有完整權限和繼承權限。'(OI)’表示這個目錄中的其他對象將繼承這個ACE。'(CI)’表示這個目錄中的其他文件夾將再次繼承這個ACE。(這個目錄碰巧沒有,但如果有的話,它將自動繼承相同的ACE)。

給文件或文件夾授予權限

現在情況開始升溫。讓我們使用/grant開關在我們的Active Directory域中設置權限並添加其他用戶。通過以下命令,我們將授予Billy Reinders(breinders)對Excellent.txt文件的唯讀(R)權限。

icacls Excellent.txt /grant reinders\breinders:R /t /c
Granting permissions to a file for a user

上一個命令已經成功完成;我通過檢查權限來驗證我的更改 – 現在我們看到’REINDERS\breinders’已經擁有唯讀(R)權限。由於我們沒有看到‘I’列出來,我們知道這不是繼承的權限,而是明確設置的。

提醒一下,‘/t’開關是用來遞歸地在整個文件夾樹上設置權限的。‘/c’開關告訴命令遇到任何錯誤時繼續進行。

刪除文件或文件夾的權限

我們使用/remove開關來從ACE中刪除權限,而不是使用/grant開關來授予/添加權限。讓我們繼續刪除Billy對Excellent.txt文件的權限。

icacls Excellent.txt /remove:g reinders\breinders /t /c
Using the /remove switch to remove permissions to a file for a user

在這裡,我們使用’/remove:g’開關來刪除先前授予Billy Reinders的權限。我再次運行命令進行驗證,您將看到Billy的ACL已經消失。太好了!?

拒絕文件或文件夾的權限

通常,您會希望避免使用「明確拒絕」權限,因為這會帶來對整個權限基礎設施的複雜性。對於大多數情況,您可以依賴「隱含拒絕」(默認情況)來處理這些情況。

如果用戶未列在 ACL 中,並且該用戶不是 ACL 中列出的任何組的成員,則 Windows 會正確地假定該用戶對該對象沒有權限。但是,下面的例子說明了這種情況可以變得非常混亂 – 如果一個用戶是兩個組的成員,其中一個組被授予訪問權限,而另一個組被拒絕,那麼該用戶將被拒絕。這本身是有道理的,但在嘗試排除這類問題時可能會變得非常錯綜複雜。

然而,如果您想要明確添加拒絕權限,您可以使用一般的「/deny」開關來完成此操作。

icacls Download /deny reinders\breinders:(OI)(CI)F /t /c
Using the /deny switch to put explicit deny permissions on a file or folder structure

在這裡,您可以看到我運行的指令;它已成功完成。然後我檢查了「下載」文件夾的安全選項卡 – 您可以看到Billy對於該對象及其所有內容都有「拒絕」權限。

如何重置對象的 ACL

I can’t tell you how many file server migrations or movements of large amounts of file projects I’ve been involved in where I just needed to start from scratch. This invaluable step includes resetting the ACLs on an object in case things get too far gone, or you succumb to a bad idea after being up all night. Maybe a malware attack crippled an entire HR directory that NEEDS to get resolved ASAP. Thankfully, you can use the ‘/reset’ flag to reset the permissions to the default.

icacls Download /reset /t /c

【圖片】

在我重新授予Billy對「下載」文件夾及其內容的「RW」權限後,我運行了重置指令。正如您所看到的,他的名字再次不見於安全選項卡上的 ACL。非常簡單。

如何保存和還原 ACLs

A wonderfully powerful feature included with icacls is the ability to backup and restore the ACL of an object to a file for safekeeping. Before you start a large script that changes or resets permissions on millions of files, you can first save the current state of those millions of files’ ACLs to a single file.

如果您在脚本的中途发现了语法错误,可以中止它,然后使用“/restore”参数的一次运行命令来恢复整个树的ACL状态!让我们试一试!

icacls Download /save Download_ACL_Backup /t
What the backed-up text file looks like with all the ACLs – wowzers!

这将保存“下载”文件夹的整个ACL树到一个名为“Download_ACL_Backup”的单个文件中。现在,我强烈建议您不要去摆弄那个文本文件。是的,它看起来像是一些疯狂的Linux之类的东西。?开玩笑的。

这是“下载”文件夹的当前状态。

The ‘Download’ folder before Junior performs his ill-advised permissions changes…

现在,让我们假设一位初级管理员授予了Billy Reinders对该位置的完全访问权限。我们还假设它包含Billy不应该访问的HR数据。

icacls Download /grant reinders\breinders:F /t /c
Our Junior Admin has granted Billy Reinders Full access to the location

在运行命令之后,我再次检查,看到Billy在此文件夹中具有完全的显式控制权。一举之间,我可以假定权限将通过运行此命令一次恢复为默认设置。

icacls Download /reset /t /c
After running the /reset switch, we see Billy no longer has explicit access!

运行重置命令后,您会看到他的名字再次从ACL中删除。他不再对该文件夹具有完全访问权限。提醒 – 这将扫描整个文件夹层次结构。

提示:在整个情景中,您可能已经意识到Billy确实具有只读访问权限,因为内置的用户组(Billy是其中的成员)具有默认的读取和执行权限。只是一个侧面说明。

如何使用icacls管理Windows完整性级别

有一個較不知名的功能內建於 Windows 中,稱為強制存取控制(MAC)。它已經存在相當長的時間。然而,微軟在 Windows Vista/Windows Server 2008 中引入了強制完整性控制(MIC)。

權限是由基於政策的固定規則定義的,通常無法被使用者覆蓋。通常被稱為 Windows 完整性控制(WIC)。完整性級別用於確定 Windows 中物件的保護級別。基本上,您總是希望確保您的使用者擁有正確的權限。

I won’t go into great detail here, but I can show you a few examples of how to use the icacls command with it. If we create a new folder, Test, in the Download directory, we can adjust its integrity level to ‘h’igh.

icacls Test /setintegritylevel h

簡而言之,高級別與以管理員身分(管理員權限)執行任務或流程所需的權限是同義的。因此,即使 Billy Reinders 對這個資料夾擁有完全控制權,除非他以某種方式獲得了魔法管理員權限,並且能夠以管理員身分執行檔案總管(他無法…),否則他將無法存取這個資料夾及其內容。

因此,基本上這是另一個安全和保護層,您可以用來保護高度敏感的資料。

如何使用 icacls 管理權限繼承

我們也可以使用icacls命令查看和修改文件和文件夾上的繼承權限。這使我們能夠對一個文件夾設置顯式權限,同時保持其餘文件夾設置為自動接受父容器的ACLs。

禁用文件和文件夾上的繼承

我們可以使用’/inheritance:d’參數在文件或文件夾上禁用繼承。在我的例子中,我們在下載文件夾中有一個Install文件夾。您可以看到該文件夾被設置為從上方繼承所有權限。

icacls Download
Disabling inheritance on the Install folder leaving only explicit ACEs

讓我們將Install文件夾上的繼承移除。

icacls Install /inheritance:d /t /c
We can see that inheritance has been disabled as the ‘Enable inheritance’ button/toggle is available

完成。您會注意到所有的“(I)”條目都消失了。這些現在都是顯式權限。而且您可以從GUI下方的驗證看到,“啟用繼承”按鈕是可用的,因為我們已經禁用了它。

結論

對我來說,icacls最引人入勝的一點是能夠用這個命令編寫複雜的項目。而且,再次強調,不用擔心文件總管遇到錯誤、崩潰等可靠性問題。

I hope you learned more about using the command line to modify permissions. Please leave a comment or question below. Thank you!

相關文章:

Source:
https://petri.com/icacls-command/