使用PowerShell管理NTFS權限:教程

如果您是一位IT专业人员,并且在设置组织的文件系统权限方面遇到困难,那么您很幸运。使用图形用户界面来管理NTFS权限非常耗时,特别是在处理许多用户或组时。幸运的是,我们有PowerShell来改善这一切。如何呢?就是使用Microsoft.PowerShell.Security模块。

PowerShell有两个专门用于处理ACL的命令,分别是Get-ACLSet-ACL。这两个命令可以检索和分配任意数量的NTFS权限,您将在本教程中了解到全部内容。如果您想在管理NTFS权限方面变得更加高效和立即有用,请继续阅读。

没时间阅读?没问题!请观看下面来自TechSnips.io的Anthony Howell的配套视频:

使用ManageEngine ADManager Plus来管理和报告Active Directory、Exchange和Microsoft 365。免费试用下载!

前提条件

要按照本教程中的示例进行操作,您需要:

创建用于测试的文件/文件夹

這教學將圍繞著一個簡單的「實驗室」或一個單獨的文件夾來進行。您將從頭開始學習如何在PowerShell中使用NTFS權限;您不需要額外的工作。

  1. 首先,以系統管理員身份打開PowerShell會話。
  2. 在文件系統中的某個位置創建一個名為Share的空文件夾。在以下示例中,假設該文件夾位於C:\Share。這樣可以使示例更短且更容易理解。您可以通過複製下面的代碼來創建此目錄:
New-Item -ItemType Directory -Path 'C:\Share'

3. 創建一個名為C:\Share\Assets的文件夾。

New-Item -ItemType Directory -Path 'C:\Share\Assets'

4. 在C:\Share文件夾中創建一個名為client_list.txt的文件。

New-Item -ItemType File -Path 'C:\Share\Client_list.txt'

5. 在C:\Share文件夾中創建一個名為client_projects.txt的文件。

New-Item -ItemType File -Path 'C:\Share\Client_projects.txt'

6. 接下來,為Share文件夾路徑分配一個變量。創建變量可以減少打字,並使路徑更易於重複使用。假設您使用的是C:\Share,將以下代碼示例複製到您的PowerShell會話中:

$dir = 'C:\Share'

7. 按Enter鍵。現在您有一個空目錄並將該路徑保存為變量。

使用Get-Acl查看NTFS權限

PowerShell允許您使用Get-Acl命令快速查看NTFS權限。在以下部分中,您將學習如何使用該命令快速查看文件或文件夾的NTFS權限。

存取控制清單(ACL)是一個存取控制項目(ACE)的清單。ACL中的每個ACE都識別了一個受託人並指定了允許、拒絕或審核的存取權限。可安全對象的安全描述符可以包含兩種類型的ACL:自主存取控制清單(DACL)和系統存取控制清單(SACL)。

顯示NTFS權限

傳統上,您可以通過右鍵點擊 C:\共享 文件夾,選擇內容,選擇安全性標籤,然後點擊高級按鈕來查看ACL。您可以在下面的示例中看到GUI如何顯示權限。

Access Control List using Advanced Security Settings for Share

上面的示例中有一些權限項目和屬性的編號。仔細檢查它們,因為稍後本節將進行比較。

使用您之前創建的目錄,使用Get-Acl命令顯示該目錄的當前NTFS權限。

Get-Acl -Path $dir

現在您應該能夠在下面的屏幕截圖中看到路徑、所有者和訪問級別的詳細信息。

Access Control List

上面的截圖中顯示的Access屬性包含了有關ACL的其他信息,但由於在FullControl的末尾顯示了三個點,它在屏幕上滾動了。有一種更好的方法可以查看此屬性,即將上一個命令括在圓括號內,以查看Access 對象屬性。只需運行以下代碼來查找此對象上的Access屬性。

(Get-Acl -Path $dir).Access

上述命令還可以使用Access對象和使用-ExpandProperties參數來表示:Get-Acl -Path $dir | Select-Object -ExpandProperty Access

如下截圖所示,輸出被包裹起來,以便更容易查看單個Access屬性:

Access Control Entities

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

(Get-Acl -Path $dir).Access | Format-Table -AutoSize

如下截圖所示,使用Format-Table -AutoSize時,訪問屬性更加清晰和有組織:

Cleaner output when piping to Format-Table

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

Access Control List using Advanced Security Settings for Share

篩選存取對象

有時,當您發現NTFS權限時,您希望更加精確。為此,您可以使用PowerShell篩選特定的ACE,或查找在ACL中具有繼承或顯式NTFS權限的特定結果。您可以使用Where-Object cmdlet進行一些篩選,而不是用眼睛逐行滾動終端窗口。

下面的代碼示例過濾不繼承NTFS權限的對象。這是通過使用Where-Object-Not運算元來查看管道中的當前對象$_.的成員對象IsInherited屬性來完成的,該屬性表示ACE是否是繼承的結果並且未明確設置:

(Get-Acl -Path $dir).Access | Where-Object {$_.IsInherited -eq $true} | Format-Table -AutoSize

請記得將對象傳遞到Format-Table -AutoSize,否則輸出將在屏幕上滾動下來。養成這個習慣,您以後會感謝我的!

使用下面的代碼,將'USERNAME'替換為另一個用戶名以查看具體結果:

(Get-Acl -Path $dir).Access | Where-Object {$_.IdentityReference -like 'USERNAME'} | Format-Table -AutoSize

以下是結果可能看起來的示例:

Sample output from the filtering

上面的示例顯示了所有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權限級別:

Client list with appropriate NTFS permissions for Bill, the new employee.

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

Client Projects with no access for Bill.

您需要將Client_List.txt的NTFS權限複製到Client_Projects.txt。您可以通過從Client_List.txt獲取ACL,然後使用Set-Acl cmdlet和-AclObject參數來修改權限。當您運行下面的代碼時,將整個ACL從Client_List.txt複製到Client_Projects.txt

# 將Client_list.txt的安全描述符複製到Client_Projects.txt
$Acl = Get-Acl -Path 'C:\Share\Client_list.txt'
Set-Acl -AclObject $Acl -Path 'C:\Share\Client_Projects.txt'

如下所示的編號截圖中,Client_Projects.txt文件現在具有與Client_list.txt相同的安全描述符。

  1. 從現有文件中獲取現有的ACL。
  2. 將複製的ACL對象設置為文件或文件夾。
  3. 檢查已正確將ACL複製到文件或文件夾中。
NTFS Permissions Copied

現在您可以看到,Client_Projects.txt文件的ACL與Client_List.txt文件完全相同,在IdentityReference列中以AccessControlType設為Allow。您也可以使用相同的技術將NTFS權限分配給文件夾。

添加NTFS權限

在上一節中,您複製了一個檔案物件的現有 NTFS 權限到另一個檔案物件中。這一次,您將從頭開始創建 NTFS 權限。這將使您能夠分配將分配給檔案或文件夾的 NTFS 權限。

首先,開始分配一些變數,用於創建一個由Set-Acl使用的新物件。這樣做可以使在運行命令時更加容易。以下代碼構建了一個 ACE 的屬性,這將成為分配給檔案或文件夾的 NTFS 權限:

# 創建 ACE
$identity = 'domain\user'
$rights = 'FullControl' #其他選項:[enum]::GetValues('System.Security.AccessControl.FileSystemRights')
$inheritance = 'ContainerInherit, ObjectInherit' #其他選項:[enum]::GetValues('System.Security.AccessControl.Inheritance')
$propagation = 'None' #其他選項:[enum]::GetValues('System.Security.AccessControl.PropagationFlags')
$type = 'Allow' #其他選項:[enum]::GetValues('System.Security.AccessControl.AccessControlType')
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,$inheritance,$propagation, $type)

接下來,再分配一個變數,該變數將獲取文件夾Assets的初始 ACL。然後,使用AddAccessRule方法成員類型,使用$ACE變數添加一個訪問規則:

$Acl = Get-Acl -Path "$dir\Assets"
$Acl.AddAccessRule($ACE)

現在,您可以將新創建的 ACE 添加到C:\Share\Assets的 ACL 中。現在使用Set-Acl將此新 ACE 應用到正確的目錄中:

Set-Acl -Path "$dir\Assets" -AclObject $Acl

接下來,使用下面的代碼驗證您選擇的使用者是否具有查看所需目錄的權限:

(Get-Acl -Path "$dir\Assets").Access | Format-Table -Autosize

移除NTFS權限

在某個時候,您需要從資源中移除NTFS權限。

要移除NTFS權限,首先要獲取文件或資料夾的當前ACL。在這個例子中,該文件是Client_Projects.txt

$Acl = Get-Acl -Path "$dir\Client_Projects.txt"

現在過濾出要移除的特定ACE。您可以通過調用$Acl成員對象並將結果傳遞給Where-Object和一些操作符來實現:

$Ace = $Acl.Access | Where-Object {($_.IdentityReference -eq 'domain\user') -and -not ($_.IsInherited)}

接下來,使用包含當前ACL安全描述符的$Acl變量,調用RemoveAccessRule方法,並使用上述使用New-Object cmdlet創建的ACE物件將其傳遞給RemoveAccessRule()方法。這將移除該條目:

$Acl.RemoveAccessRule($Ace)

重要的是要記住,在這裡您修改了現有的ACL,但尚未提交更改。

現在要使這些更改生效,運行Set-Acl cmdlet,並提供-Path-AclObject參數的適當值,例如"$dir\Client_Projects.txt"$Acl。輸入下面的命令後,按Enter鍵:

Set-Acl -Path "$dir\Client_Projects.txt" -AclObject $Acl

使用ManageEngine ADManager Plus管理和報告Active Directory、Exchange和Microsoft 365。免費試用版下載!

摘要

在這篇文章中,您學到了如何使用PowerShell管理NTFS權限。您了解到了兩個cmdlet,Get-Acl和Set-Acl,以及它們在處理NTFS權限時的功能。

您還學會了如何使用過濾器來針對ACL中的特定ACE,以供上述cmdlet使用。通過一些練習,您將能夠更輕鬆地管理比以往更多的NTFS權限請求。

進一步閱讀

Source:
https://adamtheautomator.com/ntfs-permissions/