HOWTO · PowerShell

如何使用 PowerShell 管理 ACL 權限

本文將學習不同的權限類型,以及如何使用 PowerShell 查詢、修改和刪除文件和文件夾上的 ACL。

系統管理員通過在 NTFS 文件伺服器上添加訪問控制條目 ACE 來配置 NTFS 訪問控制列表 ACL,以實現最小權限模型。

本文將學習不同的權限類型以及如何使用 PowerShell 查詢、修改和刪除文件和文件夾上的 ACL。

PowerShell 中的 NTFS 權限類型

NTFS 權限既有高級也有基本。舉例來說,您可以將每個權限設置為 拒絕允許

  • 完全控制:具有此權限的用戶可以修改、添加、移動和刪除文件和目錄,以及它們的相關屬性。此外,具有此權限的用戶可以更改所有子目錄和文件的權限設置。
  • 修改:具有此權限的用戶可以查看和修改文件及文件屬性,包括向目錄添加和刪除文件或向文件添加文件屬性。
  • 讀取和執行:具有此權限的用戶可以運行可執行文件,包括腳本。
  • 讀取:具有此權限的用戶可以查看文件、文件屬性和目錄。
  • 寫入:具有此權限的用戶可以寫入文件並向目錄添加文件。

以下是高級權限的列表:

  • 遍歷文件夾執行文件:具有此高級權限的用戶可以穿越文件夾以到達其他文件夾或文件,即使他們對這些文件或文件夾沒有權限。具有此高級權限的用戶還可以運行可執行文件。當用戶或組在組策略管理單元中沒有 繞過遍歷檢查 權限時,遍歷文件夾 權限生效。
  • 列出文件夾讀取數據:具有此高級權限的用戶可以查看文件夾中的文件和子文件夾的列表以及文件的內容。
  • 讀取屬性:具有此高級權限的用戶可以查看文件夾或文件的屬性,例如它是否是隱藏的或唯讀的。
  • 寫入屬性:具有此高級權限的用戶可以更改文件或文件夾的屬性。
  • 讀取擴展屬性:具有此高級權限的用戶可以查看文件夾或文件的擴展屬性,例如權限和創建及修改時間。
  • 寫入擴展屬性:具有此高級權限的用戶可以更改文件夾或文件的擴展屬性。
  • 創建文件寫入數據創建文件 權限將允許用戶在此高級權限的文件夾中創建文件。此權限僅適用於文件夾。 寫入數據 權限將使具有此高級權限的用戶能夠更改文件並覆蓋現有內容。此權限僅適用於文件。
  • 創建文件夾附加數據創建文件夾 權限允許用戶在此高級權限的文件夾中創建文件夾。此權限僅適用於文件夾。 附加數據 權限將使具有此高級權限的用戶能夠在文件末尾進行更改,但他們不能更改、覆蓋或刪除現有數據。此權限僅適用於文件。
  • 刪除:具有此高級權限的用戶可以刪除文件夾或文件。如果用戶對文件夾或文件沒有 刪除 權限,他們仍然可以刪除對象,只要他們對父文件夾擁有 刪除子文件夾和文件 權限。
  • 讀取權限:具有此高級權限的用戶可以讀取文件夾或文件的權限,例如 完全控制讀取寫入
  • 更改權限:具有此高級權限的用戶可以更改文件或文件夾的權限。
  • 取得所有權:具有此高級權限的用戶可以獲得文件或文件夾的所有權。文件或文件夾的擁有者始終可以更改其權限,不論任何已有的權限是否保護文件或文件夾。
  • 同步:具有此高級權限的用戶可以使用該對象進行同步。此權限將允許線程等到對象處於已信號狀態。此權限在 ACL 編輯器中不存在。

我們可以通過運行以下 PowerShell 腳本來找到這些用戶權限的所有信息:

[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])

NTFS 權限可以是顯式的或繼承的。顯式權限是單獨配置的,而繼承權限則是從父文件夾繼承的。

權限的層次結構如下:

  • 顯式拒絕
  • 顯式允許
  • 繼承拒絕
  • 繼承允許

使用 Get-Acl 命令獲取 PowerShell 中的文件夾和文件的 ACL

用於管理文件和文件夾權限的第一個 PowerShell 命令是 Get-Acl;它列出所有對象權限。

Get-Acl \\fs1\shared\hr | fl

用戶必須擁有目標和源文件夾才能複製權限。

Get-Acl \\fs1\shared\hr | Set-Acl \\fs1\shared\hr

使用 Set-Acl 命令設置 PowerShell 中的文件和文件夾的 ACL

PowerShell 的 Set-Acl 命令用於更改指定項目的安全描述符,例如文件、文件夾或註冊表項;換句話說,它用於修改文件或文件夾權限。

$acl = Get-Acl \\fs1\shared\hr

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")

$acl.SetAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\hr

使用 -RemoveAccessRule 參數在 PowerShell 中刪除用戶權限

$acl = Get-Acl \\fs1\shared\hr

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")

$acl.RemoveAccessRule($AccessRule)

$acl | Set-Acl \\fs1\shared\hr

在 PowerShell 中禁用或啟用權限繼承

要管理繼承,我們可以使用 SetAccessRuleProtection 方法。該方法有兩個參數:

  • 第一個參數負責阻止從父文件夾繼承。它返回布林狀態:$true$false
  • 第二個參數用於指示當前繼承的權限是被刪除還是保留。它也返回布林狀態:$true$false
$acl = Get-Acl \\fs1\shared\hr

$acl.SetAccessRuleProtection($true, $false)

$acl | Set-Acl \\fs1\shared\hr

讓我們撤回這一更改,並再次啟用文件夾的繼承:

$acl = Get-Acl \\fs1\shared\hr

$acl.SetAccessRuleProtection($false, $true)

$acl | Set-Acl \\fs1\shared\hr

使用 SetOwner 方法更改 PowerShell 中的文件和文件夾所有權

如果我們想要設置文件夾的所有者,您需要運行 SetOwner 方法。

$acl = Get-Acl \\fs1\shared\hr

$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISE\User01")

$acl.SetOwner($object)

$acl | Set-Acl \\fs1\shared\hr