Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

使用 PowerShell 脚本管理文件系统 ACL 的方法

使用 PowerShell 脚本管理文件系统 ACL 的方法

Aug 26, 2025

NTFS 访问控制列表(ACL)在 Windows 文件系统上强制实施最小权限访问,而 PowerShell 提供了高效的工具来管理它们。管理员可以使用 Get-Acl 来审查权限,使用 Set-Acl 来分配或移除权限,并使用 PurgeAccessRules 或 SetAccessRuleProtection 等方法来处理显式条目和继承。脚本也可以更改文件夹所有权。定期审计 NTFS 权限对防止 data leakage 并加强 insider threat 的防御至关重要。

许多拥有 Microsoft Windows 环境的组织,都依赖 NTFS 作为包含敏感数据的存储设备的主要文件系统。这是用户处理文件的最简单方式。为落实最小权限模型——这是系统安全的最佳实践——IT 安全专家和系统管理员会通过在 NTFS 文件服务器上添加访问控制项(ACE)来配置 NTFS 访问控制列表(ACL)。

文件和文件夹的 NTFS 权限类型

NTFS 权限分为基础和高级两类。你可以将每项权限设置为“允许”或“拒绝”。下面是 基础权限:

  • 完全控制: 用户可以修改、添加、移动和删除文件与文件夹,以及它们关联的属性。此外,用户还可以更改所有文件和子文件夹的权限设置。
  • 修改: 用户可以查看并修改文件及文件属性,包括删除并向目录添加文件,或向文件添加文件属性。
  • 读取并执行: 用户可以运行可执行文件,包括脚本
  • 读取: 用户可以查看文件、文件属性和目录。
  • 写入: 用户可以向文件写入内容,并向目录中添加文件。

以下是 高级权限 的列表:

  • 遍历文件夹/执行文件: 用户可以通过文件夹导航以访问其他文件或文件夹,即使他们对这些文件或文件夹没有权限。用户也可以运行可执行文件。“遍历文件夹”权限仅在组或用户在 Group Policy 管理单元中不具有“Bypass Traverse Checking”权限时才生效。
  • 列出文件夹/读取数据: 用户可以查看文件夹内的文件和子文件夹列表,以及文件的内容。
  • 读取属性: 用户可以查看文件或文件夹的属性,例如该文件或文件夹是否为只读或是否隐藏。
  • 写入属性:用户可以更改文件或文件夹的属性。
  • 读取扩展属性: 用户可以查看文件或文件夹的扩展属性,例如权限以及创建和修改时间。
  • 写入扩展属性: 用户可以更改文件或文件夹的扩展属性。
  • 创建文件/写入数据: “Create Files(创建文件)” 权限允许用户在该文件夹中创建文件。(此权限仅适用于文件夹。)“Write Data(写入数据)” 权限允许用户对文件进行更改并覆盖现有内容。(此权限仅适用于文件。)
  • 创建文件夹/追加数据: “创建文件夹”权限允许用户在某个文件夹内创建文件夹。(此权限仅适用于文件夹。) “追加数据”权限允许用户对文件末尾进行更改,但他们不能更改、删除或覆盖现有数据。(此权限仅适用于文件。)
  • 删除: 用户可以删除文件或文件夹。(如果用户在某个文件或文件夹上没有“删除”权限,只要他们在父文件夹上具有“删除子文件夹和文件”权限,仍然可以将其删除。)
  • 读取权限: 用户可以读取文件或文件夹的权限,例如“完全控制”、“读取”和“写入”。
  • 更改权限: 用户可以更改文件或文件夹的权限。
  • 获取所有权: 用户可以获取文件或文件夹的所有权。文件或文件夹的所有者始终都可以更改其权限,无论是否存在用于保护该文件或文件夹的任何现有权限。
  • 同步:用户可以使用该对象进行同步。这使得线程能够一直等待,直到该对象处于已发出信号的状态。该权限不会在 ACL Editor 中显示。你可以在 此处了解更多。

你可以通过运行以下 PowerShell 脚本来查找所有这些用户权限:

      [system.enum]::getnames([System.Security.AccessControl.FileSystemRights])
      

NTFS 权限可以是显式的,也可以是继承的。显式权限是单独配置的权限,而继承权限则是从父文件夹继承来的权限。权限的层级结构如下:

  • 显式拒绝
  • 显式允许
  • 继承拒绝
  • 继承允许

既然我们已经了解了 NTFS 权限是什么,接下来就让我们探索如何对其进行管理。

使用 Netwrix Directory Manager 简化权限管理

确保只有授权用户才能访问特定文件和文件夹

获取文件和文件夹的 ACL

用于管理文件和文件夹权限的第一个 PowerShell cmdlet 是“get-acl”;它会列出所有对象权限。例如,我们来获取对象路径“\fs1sharedsales”:

      get-acl \fs1sharedsales | fl
      
Manage File System ACLs with PowerShell Scripts Get ACL for Files and Folders

如果你想通过 PowerShell 获取完整的 NTFS 权限报告,你可以按照这份关于 将 NTFS 权限导出到 CSV 的简单教程来操作。

复制文件和文件夹权限

要复制权限,用户必须同时拥有源文件夹和目标文件夹。下面的命令会将“Accounting”文件夹中的权限复制到“Sales”文件夹:

      get-acl \fs1sharedaccounting | Set-Acl \fs1sharedsales
      
Manage File System ACLs with PowerShell Scripts Copy File and Folder Permissions

从权限复制前后“get-acl”命令的输出可以看到,“Sales”共享文件夹的权限已发生更改。

设置文件和文件夹权限

PowerShell “set-acl” cmdlet 用于更改指定项(例如文件、文件夹或注册表项)的安全描述符(security descriptor);换句话说,它用于修改文件或文件夹的权限。下面的脚本会将用户 “ENTERPRISET.Simpson” 对文件夹 “Sales” 的 “FullControl” 权限设置为 “Allow”:

      $acl = Get-Acl \fs1sharedsales

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISET.Simpson","FullControl","Allow")

$acl.SetAccessRule($AccessRule)

$acl | Set-Acl \fs1sharedsales
      
How to Manage File System ACLs with PowerShell Scripts Copy File and Folder Permissions

如果要为用户或安全组设置其他权限,请从下表中进行选择:

How to Manage File System ACLs with PowerShell Scripts Setting permissions to users or security groups

还可以应用一组基本访问权限的权限集:

How to Manage File System ACLs with PowerShell Scripts Permissions sets of basic access right

移除用户权限

要删除权限,请使用“RemoveAccessRule”参数。让我们删除为 T.Simpson 对“Sales”文件夹的“Allow FullControl”权限:

      $acl = Get-Acl \fs1sharedsales

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISET.Simpson","FullControl","Allow")

$acl.RemoveAccessRule($AccessRule)

$acl | Set-Acl \fs1sharedsales
      
How to Manage File System ACLs with PowerShell Scripts Remove User Permissions

注意:T.Simpson 仍然拥有“Deny FullControl”权限。要将其移除,请使用命令“PurgeAccessRules”,该命令将彻底清除 T.Simpson 对“Sales”文件夹的所有权限:

      $acl = Get-Acl \fs1sharedsales

$usersid = New-Object System.Security.Principal.Ntaccount ("ENTERPRISET.Simpson")

$acl.PurgeAccessRules($usersid)

$acl | Set-Acl \fs1sharedsales
      
How to Manage File System ACLs with PowerShell Scripts Removing User Permissions

请注意,“PurgeAccessRules” 不能与字符串形式的用户名一起使用;它只适用于 SIDs。因此,我们使用了 “Ntaccount” 类,将用户帐户名称从字符串转换为 SID。还要注意,“PurgeAccessRules” 只适用于显式权限,不会清除继承的权限。

禁用或启用权限继承

要管理继承,我们使用“SetAccessRuleProtection”方法。它有两个参数:

  • 第一个参数负责阻止从父文件夹继承。它有两种状态:“$true”和“$false”。
  • 第二个参数用于确定当前继承的权限是保留还是移除。它同样有两种状态:“$true”和“$false”。

让我们为“Sales”文件夹禁用继承,并同时删除所有继承的权限:

      $acl = Get-Acl \fs1sharedsales

$acl.SetAccessRuleProtection($true,$false)

$acl | Set-Acl \fs1sharedsales
      
How to Manage File System ACLs with PowerShell Scripts Disabling Permissions Inheritance

现在只剩下一个访问权限(因为它是明确添加的);所有继承的权限都已被移除。

让我们撤销此更改,并再次为文件夹“Sales”启用继承:

      $acl = Get-Acl \fs1sharedsales

$acl.SetAccessRuleProtection($false,$true)

$acl | Set-Acl \fs1sharedsales
      
Managing File System ACLs with PowerShell Script Enabling Permissions Inheritance

更改文件和文件夹的所有者

如果你想为某个文件夹指定所有者,需要运行“SetOwner”方法。让我们把“ENTERPRISEJ.Carter”设为“Sales”文件夹的所有者:

      $acl = Get-Acl \fs1sharedsales

$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISEJ.Carter")

$acl.SetOwner($object)

$acl | Set-Acl \fs1sharedsales
      
Managing File System ACLs with PowerShell Script Changing Folder Ownership

请注意,我们再次使用了“Ntaccount”类,将用户账户名称从字符串转换为 SID。

请注意,“SetOwner” 方法并不能让你把所有者更改为任何你想要的账户;该账户必须具备“Take Ownership”“Read”和“Change Permissions”权限。

正如你所见,使用 PowerShell 管理 NTFS 权限 非常容易。但别忘了同时审计 NTFS 权限——为了降低数据泄露并应对内部威胁以及其他 IT 安全风险,安全关键在于追踪对文件服务器所做的所有变更。下面是一个关于 如何使用 PowerShell 审计 NTFS 权限 的基础指南。

面向初学者的 PowerShell 脚本教程

了解更多

分享到

了解更多

关于作者

Asset Not Found

Jeff Melnick

系统工程总监

Jeff 是 Netwrix 的前 Global Solutions Engineering 总监。他是一位长期的 Netwrix 博主、演讲者和讲解员。在 Netwrix 博客中,Jeff 分享各种生活技巧,以及可以显著提升您系统管理体验的提示与技巧。