如果您是IT专业人士,并且发现自己在为组织设置文件系统权限方面遇到困难,那么您很幸运。使用图形用户界面(GUI)管理NTFS权限非常耗时,特别是在与许多用户或组一起工作时。幸运的是,我们有PowerShell可以让一切变得更好。如何?使用Microsoft.PowerShell.Security模块。
PowerShell有两个专门用于处理ACL的cmdlet,分别是Get-ACL
和Set-ACL
。这两个cmdlet可以检索和分配任意数量的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权限。
访问控制列表(ACL是访问控制条目(ACE)的列表。 ACL中的每个ACE标识受信任者并指定允许、拒绝或审计的访问权限。可安全对象的安全描述符可以包含两种类型的ACL:DACL和SACL。
显示NTFS权限
传统上,您可以通过右键单击C:\Share文件夹,在属性上单击,选择安全选项卡,然后单击高级按钮来查看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进行一些过滤,而不是用眼睛逐行滚动终端窗口。
下面的代码示例通过使用Where-Object
和查看流水线中的当前对象的$_.
成员对象属性IsInherited
来过滤未继承NTFS权限的对象。这表示ACE是否是继承的结果且未明确设置:
记得将对象传输到
Format-Table -AutoSize
,否则输出将在屏幕上滚动。养成这个新习惯;以后会感激的!
使用下面的代码,将'USERNAME'
替换为另一个用户名以查看具体结果:
下面是结果可能看起来像的示例:

上面的示例显示了所有IdentityReference
属性为用户或安全组的ACE。
继续练习你已经学到的关于
Get-Acl
的知识。检查系统上的一些不同文件和文件夹。这将帮助你看到许多不同上下文的安全描述符。这也将有助于建立一些肌肉记忆。
让我们提升一下,并分配NTFS权限。
使用Set-Acl修改NTFS权限
现在你可以查看NTFS权限了,是时候使用PowerShell分配和修改NTFS权限了。Set-Acl
命令使这成为可能。以下部分将演示如何结合Get-Acl
使用此命令来复制、修改继承,并从文件或文件夹中移除NTFS权限。
复制NTFS权限
你可能有一个包含你需要为新ACL使用的适当级别NTFS权限的文件或文件夹。通过从一个文件或文件夹复制权限到另一个,你可以节省时间。
复制现有的ACLs/ACEs可以减少在设置NTFS权限时的人为错误,前提是你从中复制的安全描述符在第一位是正确的,并且适用于目的地。正如俗话说,“伴随着强大的力量而来的是巨大的责任。”。记住这一点。
考虑以下截图。您正在查看名为Client_List.txt的C:\Share中文件的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
参数来修改权限。当您运行以下代码时,将从Client_List.txt复制整个ACL到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
使用的新对象。这样做会使您在运行命令时更容易一些。下面的代码构建了将成为分配给文件或文件夹的NTFS权限的ACE的属性:
接下来,再分配一个变量,该变量将获取文件夹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 权限请求。