使用 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
如果你想通过 PowerShell 获取完整的 NTFS 权限报告,你可以按照这份关于 将 NTFS 权限导出到 CSV 的简单教程来操作。
复制文件和文件夹权限
要复制权限,用户必须同时拥有源文件夹和目标文件夹。下面的命令会将“Accounting”文件夹中的权限复制到“Sales”文件夹:
get-acl \fs1sharedaccounting | Set-Acl \fs1sharedsales
从权限复制前后“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
如果要为用户或安全组设置其他权限,请从下表中进行选择:
还可以应用一组基本访问权限的权限集:
移除用户权限
要删除权限,请使用“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
注意: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
请注意,“PurgeAccessRules” 不能与字符串形式的用户名一起使用;它只适用于 SIDs。因此,我们使用了 “Ntaccount” 类,将用户帐户名称从字符串转换为 SID。还要注意,“PurgeAccessRules” 只适用于显式权限,不会清除继承的权限。
禁用或启用权限继承
要管理继承,我们使用“SetAccessRuleProtection”方法。它有两个参数:
- 第一个参数负责阻止从父文件夹继承。它有两种状态:“$true”和“$false”。
- 第二个参数用于确定当前继承的权限是保留还是移除。它同样有两种状态:“$true”和“$false”。
让我们为“Sales”文件夹禁用继承,并同时删除所有继承的权限:
$acl = Get-Acl \fs1sharedsales
$acl.SetAccessRuleProtection($true,$false)
$acl | Set-Acl \fs1sharedsales
现在只剩下一个访问权限(因为它是明确添加的);所有继承的权限都已被移除。
让我们撤销此更改,并再次为文件夹“Sales”启用继承:
$acl = Get-Acl \fs1sharedsales
$acl.SetAccessRuleProtection($false,$true)
$acl | Set-Acl \fs1sharedsales
更改文件和文件夹的所有者
如果你想为某个文件夹指定所有者,需要运行“SetOwner”方法。让我们把“ENTERPRISEJ.Carter”设为“Sales”文件夹的所有者:
$acl = Get-Acl \fs1sharedsales
$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISEJ.Carter")
$acl.SetOwner($object)
$acl | Set-Acl \fs1sharedsales
请注意,我们再次使用了“Ntaccount”类,将用户账户名称从字符串转换为 SID。
请注意,“SetOwner” 方法并不能让你把所有者更改为任何你想要的账户;该账户必须具备“Take Ownership”“Read”和“Change Permissions”权限。
正如你所见,使用 PowerShell 管理 NTFS 权限 非常容易。但别忘了同时审计 NTFS 权限——为了降低数据泄露并应对内部威胁以及其他 IT 安全风险,安全关键在于追踪对文件服务器所做的所有变更。下面是一个关于 如何使用 PowerShell 审计 NTFS 权限 的基础指南。
面向初学者的 PowerShell 脚本教程
了解更多分享到
了解更多
关于作者
Jeff Melnick
系统工程总监
Jeff 是 Netwrix 的前 Global Solutions Engineering 总监。他是一位长期的 Netwrix 博主、演讲者和讲解员。在 Netwrix 博客中,Jeff 分享各种生活技巧,以及可以显著提升您系统管理体验的提示与技巧。