如果您是一位IT专业人员,并且在设置组织的文件系统权限方面遇到困难,那么您很幸运。使用图形用户界面来管理NTFS权限非常耗时,特别是在处理许多用户或组时。幸运的是,我们有PowerShell来改善这一切。如何呢?就是使用Microsoft.PowerShell.Security模块。
PowerShell有两个专门用于处理ACL的命令,分别是Get-ACL
和Set-ACL
。这两个命令可以检索和分配任意数量的NTFS权限,您将在本教程中了解到全部内容。如果您想在管理NTFS权限方面变得更加高效和立即有用,请继续阅读。
没时间阅读?没问题!请观看下面来自TechSnips.io的Anthony Howell的配套视频:
使用ManageEngine ADManager Plus来管理和报告Active Directory、Exchange和Microsoft 365。免费试用下载!
前提条件
要按照本教程中的示例进行操作,您需要:
- PowerShell 7或Windows PowerShell 5.1
- A basic understanding of NTFS file and folder permissions
创建用于测试的文件/文件夹
這教學將圍繞著一個簡單的「實驗室」或一個單獨的文件夾來進行。您將從頭開始學習如何在PowerShell中使用NTFS權限;您不需要額外的工作。
- 首先,以系統管理員身份打開PowerShell會話。
- 在文件系統中的某個位置創建一個名為Share的空文件夾。在以下示例中,假設該文件夾位於C:\Share。這樣可以使示例更短且更容易理解。您可以通過複製下面的代碼來創建此目錄:
3. 創建一個名為C:\Share\Assets的文件夾。
4. 在C:\Share文件夾中創建一個名為client_list.txt的文件。
5. 在C:\Share文件夾中創建一個名為client_projects.txt的文件。
6. 接下來,為Share文件夾路徑分配一個變量。創建變量可以減少打字,並使路徑更易於重複使用。假設您使用的是C:\Share,將以下代碼示例複製到您的PowerShell會話中:
7. 按Enter鍵。現在您有一個空目錄並將該路徑保存為變量。
使用Get-Acl查看NTFS權限
PowerShell允許您使用Get-Acl
命令快速查看NTFS權限。在以下部分中,您將學習如何使用該命令快速查看文件或文件夾的NTFS權限。
顯示NTFS權限
傳統上,您可以通過右鍵點擊 C:\共享 文件夾,選擇內容,選擇安全性標籤,然後點擊高級按鈕來查看ACL。您可以在下面的示例中看到GUI如何顯示權限。

上面的示例中有一些權限項目和屬性的編號。仔細檢查它們,因為稍後本節將進行比較。
使用您之前創建的目錄,使用Get-Acl
命令顯示該目錄的當前NTFS權限。
現在您應該能夠在下面的屏幕截圖中看到路徑、所有者和訪問級別的詳細信息。

上面的截圖中顯示的Access
屬性包含了有關ACL的其他信息,但由於在FullControl的末尾顯示了三個點,它在屏幕上滾動了。有一種更好的方法可以查看此屬性,即將上一個命令括在圓括號內,以查看Access
對象屬性。只需運行以下代碼來查找此對象上的Access
屬性。
上述命令還可以使用
Access
對象和使用-ExpandProperties
參數來表示:Get-Acl -Path $dir | Select-Object -ExpandProperty Access
如下截圖所示,輸出被包裹起來,以便更容易查看單個Access
屬性:

以上的方式查看存取屬性,如果您有許多存取控制實體(ACE),則終端輸出將快速滾動屏幕。每個實體包含FileSystemRights、AccessControlType、IdentityReference、IsInherited、InheritenceFlags和PropagationFlags屬性。為了使這一切更易讀,將對象傳遞給Format-Table -AutoSize
。運行以下命令。
如下截圖所示,使用Format-Table -AutoSize
時,訪問屬性更加清晰和有組織:

檢查屬性和列號。請注意,這些屬性與教程開始時在GUI中看到的屬性相同。

篩選存取對象
有時,當您發現NTFS權限時,您希望更加精確。為此,您可以使用PowerShell篩選特定的ACE,或查找在ACL中具有繼承或顯式NTFS權限的特定結果。您可以使用Where-Object
cmdlet進行一些篩選,而不是用眼睛逐行滾動終端窗口。
下面的代碼示例過濾不繼承NTFS權限的對象。這是通過使用Where-Object
和-Not
運算元來查看管道中的當前對象$_.
的成員對象IsInherited
屬性來完成的,該屬性表示ACE是否是繼承的結果並且未明確設置:
請記得將對象傳遞到
Format-Table -AutoSize
,否則輸出將在屏幕上滾動下來。養成這個習慣,您以後會感謝我的!
使用下面的代碼,將'USERNAME'
替換為另一個用戶名以查看具體結果:
以下是結果可能看起來的示例:

上面的示例顯示了所有ACE,其中IdentityReference
屬性是分配權限的用戶或安全組。
繼續練習你已經學到的關於
Get-Acl
的知識。檢查一下系統上的不同文件和文件夾,這將幫助你看到不同情境下的許多不同安全描述符。這也有助於建立一些肌肉記憶。
讓我們提升一個檔次並分配NTFS權限。
使用Set-Acl修改NTFS權限
現在你已經能夠查看NTFS權限,是時候使用PowerShell來分配和修改NTFS權限了。Set-Acl
指令確保了這一點。以下幾節將演示如何使用這個指令碼與Get-Acl
一起,複製、修改繼承和刪除文件或文件夾的NTFS權限。
複製NTFS權限
你可能有一個包含你需要用於新ACL的適當級別NTFS權限的文件或文件夾。通過從一個文件或文件夾複製權限可以節省時間。
當設置NTFS權限時,複製現有的ACLs/ACEs可以減少人為錯誤,前提是你從中複製的安全描述符在目的地上是正確且合適的。正如俗話所說:“大權獲得大責任。”請謹記這一點。
請參考以下截圖。在這裡,您正在查看名為C:\Share中的一個文件Client_List.txt的ACL。此ACL具有您所需的正確的NTFS權限級別:

現在,請參考下一個截圖。這次,您正在查看名為C:\Share中的另一個文件Client_Projects.txt的ACL。該文件沒有您所需的NTFS權限:

您需要將Client_List.txt的NTFS權限複製到Client_Projects.txt。您可以通過從Client_List.txt獲取ACL,然後使用Set-Acl
cmdlet和-AclObject
參數來修改權限。當您運行下面的代碼時,將整個ACL從Client_List.txt複製到Client_Projects.txt:
如下所示的編號截圖中,Client_Projects.txt文件現在具有與Client_list.txt相同的安全描述符。
- 從現有文件中獲取現有的ACL。
- 將複製的ACL對象設置為文件或文件夾。
- 檢查已正確將ACL複製到文件或文件夾中。

現在您可以看到,Client_Projects.txt文件的ACL與Client_List.txt文件完全相同,在IdentityReference列中以AccessControlType設為Allow。您也可以使用相同的技術將NTFS權限分配給文件夾。
添加NTFS權限
在上一節中,您複製了一個檔案物件的現有 NTFS 權限到另一個檔案物件中。這一次,您將從頭開始創建 NTFS 權限。這將使您能夠分配將分配給檔案或文件夾的 NTFS 權限。
首先,開始分配一些變數,用於創建一個由Set-Acl
使用的新物件。這樣做可以使在運行命令時更加容易。以下代碼構建了一個 ACE 的屬性,這將成為分配給檔案或文件夾的 NTFS 權限:
接下來,再分配一個變數,該變數將獲取文件夾Assets
的初始 ACL。然後,使用AddAccessRule
方法成員類型,使用$ACE
變數添加一個訪問規則:
現在,您可以將新創建的 ACE 添加到C:\Share\Assets
的 ACL 中。現在使用Set-Acl
將此新 ACE 應用到正確的目錄中:
接下來,使用下面的代碼驗證您選擇的使用者是否具有查看所需目錄的權限:
移除NTFS權限
在某個時候,您需要從資源中移除NTFS權限。
要移除NTFS權限,首先要獲取文件或資料夾的當前ACL。在這個例子中,該文件是Client_Projects.txt
:
現在過濾出要移除的特定ACE。您可以通過調用$Acl
成員對象並將結果傳遞給Where-Object
和一些操作符來實現:
接下來,使用包含當前ACL安全描述符的$Acl
變量,調用RemoveAccessRule
方法,並使用上述使用New-Object
cmdlet創建的ACE物件將其傳遞給RemoveAccessRule()
方法。這將移除該條目:
重要的是要記住,在這裡您修改了現有的ACL,但尚未提交更改。
現在要使這些更改生效,運行Set-Acl
cmdlet,並提供-Path
和-AclObject
參數的適當值,例如"$dir\Client_Projects.txt"
和$Acl
。輸入下面的命令後,按Enter鍵:
使用ManageEngine ADManager Plus管理和報告Active Directory、Exchange和Microsoft 365。免費試用版下載!
摘要
在這篇文章中,您學到了如何使用PowerShell管理NTFS權限。您了解到了兩個cmdlet,Get-Acl和Set-Acl,以及它們在處理NTFS權限時的功能。
您還學會了如何使用過濾器來針對ACL中的特定ACE,以供上述cmdlet使用。通過一些練習,您將能夠更輕鬆地管理比以往更多的NTFS權限請求。