使用 PowerShell 管理 NTFS 权限:教程

如果您是IT专业人士,并且发现自己在为组织设置文件系统权限方面遇到困难,那么您很幸运。使用图形用户界面(GUI)管理NTFS权限非常耗时,特别是在与许多用户或组一起工作时。幸运的是,我们有PowerShell可以让一切变得更好。如何?使用Microsoft.PowerShell.Security模块。

PowerShell有两个专门用于处理ACL的cmdlet,分别是Get-ACLSet-ACL。这两个cmdlet可以检索和分配任意数量的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:\Share文件夹,在属性上单击,选择安全选项卡,然后单击高级按钮来查看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进行一些过滤,而不是用眼睛逐行滚动终端窗口。

下面的代码示例通过使用Where-Object和查看流水线中的当前对象的$_.成员对象属性IsInherited来过滤未继承NTFS权限的对象。这表示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

上面的示例显示了所有IdentityReference属性为用户或安全组的ACE。

继续练习你已经学到的关于Get-Acl的知识。检查系统上的一些不同文件和文件夹。这将帮助你看到许多不同上下文的安全描述符。这也将有助于建立一些肌肉记忆。

让我们提升一下,并分配NTFS权限。

使用Set-Acl修改NTFS权限

现在你可以查看NTFS权限了,是时候使用PowerShell分配和修改NTFS权限了。Set-Acl命令使这成为可能。以下部分将演示如何结合Get-Acl使用此命令来复制、修改继承,并从文件或文件夹中移除NTFS权限。

复制NTFS权限

你可能有一个包含你需要为新ACL使用的适当级别NTFS权限的文件或文件夹。通过从一个文件或文件夹复制权限到另一个,你可以节省时间。

复制现有的ACLs/ACEs可以减少在设置NTFS权限时的人为错误,前提是你从中复制的安全描述符在第一位是正确的,并且适用于目的地。正如俗话说,“伴随着强大的力量而来的是巨大的责任。”。记住这一点。

考虑以下截图。您正在查看名为Client_List.txtC:\Share中文件的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参数来修改权限。当您运行以下代码时,将从Client_List.txt复制整个ACL到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使用的新对象。这样做会使您在运行命令时更容易一些。下面的代码构建了将成为分配给文件或文件夹的NTFS权限的ACE的属性:

# 创建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-AclSet-Acl,以及它们在处理 NTFS 权限时的功能。

您还学会了如何使用过滤器来定位 ACL 中特定 ACE,以在上述 cmdlet 中使用。通过一些练习,您将轻松处理比以往更多的 NTFS 权限请求。

深入阅读

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