当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

作者:精品下载站 日期:2024-12-14 13:02:20 浏览:17 分类:玩电脑

如何使用 PowerShell 管理 NTFS 权限


如果您是一名 IT 专业人员,并且发现自己在为组织设置文件系统权限方面遇到困难,那么您很幸运。使用 GUI 管理 NTFS 权限非常耗时,尤其是在处理许多用户或组时。幸运的是,我们有 PowerShell 来让这一切变得更好。如何? Microsoft.PowerShell.Security 模块。

PowerShell 有两个专门用于处理 ACL 的 cmdlet,分别为 Get-ACLSet-ACL。这两个 cmdlet 可以检索和分配任意数量的 NTFS 权限,您将在本教程中了解所有这些内容。如果您想在管理 NTFS 权限方面变得更加高效且立即有用,请继续阅读。

没时间读书?没问题!请观看下面来自 TechSnips.io 的 Anthony Howell 的配套视频:

先决条件

要按照本教程中的示例进行操作,您需要:

  • PowerShell 7 或 Windows PowerShell 5.1
  • 对 NTFS 文件和文件夹权限的基本了解

创建要测试的文件/文件夹

本教程将围绕一个简单的“实验室”或单个文件夹构建。您将了解如何在 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. 接下来,为共享文件夹路径分配一个变量。创建变量可以减少输入量并使路径更易于重用。假设您使用的是C:\Share,请将以下代码示例复制到您的 PowerShell 会话中:

$dir = 'C:\Share'

7. 按输入键。您现在有一个空目录并将该路径保存为变量。

使用 Get-Acl 查看 NTFS 权限

PowerShell 允许您使用 Get-Acl cmdlet 快速查看 NTFS 权限。在以下部分中,您将了解如何使用 cmdlet 查看文件或文件夹的 NTFS 权限。

访问控制列表(ACL 是访问控制条目 (ACE) 的列表。ACL 中的每个 ACE 标识一个受托者并指定允许、拒绝或审核的访问权限。安全对象的安全描述符可以包含两个ACL 的类型:DACL 和 SACL。

显示 NTFS 权限

传统上,您可以通过右键单击C:\Share文件夹,单击属性,选择安全选项卡,然后查看 ACL。单击高级按钮。您可以在下面看到 GUI 如何显示权限的示例。

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

上面的示例有一些权限条目和属性编号。仔细检查它们,您将在本节后面看到比较。

使用您之前创建的目录,使用 Get-Acl 显示该目录的当前 NTFS 权限。

Get-Acl -Path $dir

您现在应该在以下屏幕截图中看到路径、所有者和访问级别详细信息。

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

上面屏幕截图中显示的 Access 属性包含有关 ACL 的附加信息,但它会滚动到屏幕之外,如上面 FullControl 末尾的三个点所示。有一种更好的方法来查看此属性,即将上一个命令括在圆括号或圆括号中以查看 Access 对象属性。仅通过运行以下代码查找该对象的 Access 属性。

(Get-Acl -Path $dir).Access

上面的命令也可以使用Access对象和-ExpandProperties参数来表达:Get-Acl -Path $dir |选择对象-展开属性访问

如以下屏幕截图所示,输出被包装以使命令更容易查看各个 Access 属性:

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

如果您有许多访问控制实体 (ACE),则以上述方式查看访问属性可以使终端输出快速向下滚动屏幕。每个实体都包含 FileSystemRights、AccessControlType、IdentityReference、IsInherited、InheritenceFlags 和 PropagationFlags 属性。为了使这一切更具可读性,请将对象通过管道传输到Format-Table -AutoSize。运行以下命令。

(Get-Acl -Path $dir).Access | Format-Table -AutoSize

正如您在下面的屏幕截图中看到的,使用 Format-Table -AutoSize 时,访问属性更加清晰、更有条理:

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

检查属性和列号。请注意,这些属性与您在教程开始时在 GUI 中看到的属性相同。

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

过滤访问对象

有时您需要更精确地发现 NTFS 权限。为此,您可以筛选特定 ACE,或使用 PowerShell 查找 ACL 中继承或显式 NTFS 权限的特定结果。您可以使用 Where-Object cmdlet 进行一些过滤,而不是用眼睛逐行滚动终端窗口。

下面的代码示例过滤不继承 NTFS 权限的对象。这是通过使用 Where-Object-Not 操作数来查看管道中的当前对象 $_. 成员对象属性 IsInherited ,表示 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

下面是结果的示例:

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

上面的示例显示了 IdentityReference 属性是用户或安全组分配的权限的所有 ACE。

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

让我们更进一步并分配 NTFS 权限。

使用 Set-Acl 修改 NTFS NTFS 权限

现在您可以查看 NTFS 权限,接下来可以使用 PowerShell 分配和修改 NTFS 权限。 Set-Acl cmdlet 使这成为可能。以下部分将演示如何将此 cmdlet 与 Get-Acl 结合使用来复制、修改继承以及删除文件或文件夹的 NTFS 权限。

复制 NTFS 权限

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

复制现有的 ACL/ACE 可以减少设置 NTFS 权限时的人为错误,前提是您要复制的安全描述符是正确的并且首先适合目标。俗话说“能力越大,责任越大”。请记住这一点。

考虑下面的屏幕截图。在这里,您正在查看 C:\Share 中名为 Client_List.txt 的文件的 ACL。该 ACL 具有您想要的正确的 NTFS 权限级别:

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

现在,考虑下一个屏幕截图。这次您将查看 C:\Share 中名为 Client_Projects.txt 的另一个文件的 ACL。该文件不具有您所需的 NTFS 权限:

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

您需要将 NTFS 权限从 Client_List.txt 复制到 Client_Projects.txt。你怎么能这样做呢?您将通过从 Client_List.txt 获取 ACL,然后使用带有 -AclObject 参数的 Set-Acl cmdlet 来修改权限。当您运行以下代码时,Client_List.txt 中的整个 ACL 会复制到 Client_Projects.txt

# Copy Client_list.txt Security Descriptors to 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 是否正确复制到文件或文件夹。

[玩转系统] 如何使用 PowerShell 管理 NTFS 权限

您现在可以看到,Client_Projects.txt 文件的 ACL 与 IdentityReference 列中具有 AccessControlType 的 Client_List.txt 文件相同设置为允许。您也可以使用相同的技术为文件夹分配 NTFS 权限。

添加NTFS权限

在上一节中,您将现有 NTFS 权限从一个文件对象复制到另一个文件对象。这次您将从头开始创建 NTFS 权限。这将允许您分配将分配给文件或文件夹的 NTFS 权限。

首先,开始分配一些变量以用于创建 Set-Acl 使用的新对象。这样做可以让运行命令时变得更容易一些。下面的代码构建了 ACE 的属性,该属性将成为分配给文件或文件夹的 NTFS 权限:

# Create the ACE
$identity = 'domain\user'
$rights = 'FullControl' #Other options: [enum]::GetValues('System.Security.AccessControl.FileSystemRights')
$inheritance = 'ContainerInherit, ObjectInherit' #Other options: [enum]::GetValues('System.Security.AccessControl.Inheritance')
$propagation = 'None' #Other options: [enum]::GetValues('System.Security.AccessControl.PropagationFlags')
$type = 'Allow' #Other options: [enum]::GetValues('System.Securit y.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 传递上面创建的 ACE 对象code> cmdlet 到 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

概括

在本文中,您了解了如何使用 PowerShell 管理 NTFS 权限。您已经了解了两个 cmdlet:Get-AclSet-Acl,以及它们如何使用 NTFS 权限。

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

进一步阅读

  • 获取 Acl
  • 设置Acl
  • 文件系统权限枚举
  • [访问控制列表](https://docs.microsoft.com/en-us/windows/win32/secauthz/access-control-lists#:~:text=访问控制列表 (ACL) 是一个列表,其类型ACL%3A DACL 和 SACL。)
  • 复制Acl

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯