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

[玩转系统] 获取 ACL 和设置 ACL

作者:精品下载站 日期:2024-12-14 13:37:57 浏览:15 分类:玩电脑

获取 ACL 和设置 ACL


[玩转系统] 获取 ACL 和设置 ACL

PowerShell 是一个非常高效的工具,可以对 NTFS 权限执行批量更改。

要使用的两个主要命令是 Get-ACL 和 Set-ACL。

让我们用一个现实生活中的例子来看看它是如何完成的。

重置文件夹继承并设置 NTFS 权限

在以下示例中,我们希望通过从单独分配的权限转变为组分配的权限来实施 Microsoft 最佳实践。

考虑 Mars_Data 文件夹,其中三个用户已被分配完全控制权:

[玩转系统] 获取 ACL 和设置 ACL

首先,我们不希望直接为用户分配权限,因为这意味着我们必须转到文件夹属性来更改它。

Microsoft 的最佳实践是使用域本地组进行权限分配,因此我们创建一个组“DL.Mars_Data.Modify”。

通过使用域本地组,我们只需修改组成员身份即可在 Active Directory 中集中授予或删除数据访问权限。

其次,我们希望启用 Mars_Data 文件夹的继承,以从顶级文件夹传播系统和管理员访问权限。

为了实现这一点,我们的 PowerShell 脚本需要执行三个步骤:

  1. 首先,从文件夹中删除任何现有的显式(非继承)权限。
  2. 启用文件夹的继承。
  3. 将修改权限分配给我们的组。

让我们看看它是如何完成的。

使用 PowerShell 删除非继承权限

要修改文件夹权限,我们首先需要使用 Get-ACL 获取现有的 ACL(访问控制列表):

$FolderPath = "c:\ms_tmp\Projects\P0001-P0050\Mars_Data"
$Acl = Get-Acl -Path $FolderPath

然后,我们迭代 ACL 中的 ACE(访问控制条目)并删除所有未继承的 ACE:

ForEach ($Ace In $Acl.Access) {
    If ($Ace.IsInherited -eq $false) {
        $Acl.RemoveAccessRuleSpecific($Ace)
    }
}

ACL的改变实际上是在内存中进行的。因此,我们总是需要在进行更改后使用 Set-Acl 将更改后的 ACL 提交到文件夹:

Set-Acl -Path $FolderPath -ACLObject $Acl

使用 PowerShell 启用权限继承

要启用 NTFS 权限的继承,我们使用以下命令:

$FolderPath = "c:\ms_tmp\Projects\P0001-P0050\Mars_Data"
$Acl = Get-Acl -Path $FolderPath
$Acl.SetAccessRuleProtection($false, $false)
Set-Acl -Path $FolderPath -ACLObject $Acl

与前面的示例一样,我们使用 Get-Acl 读取 ACL,通过启用继承来修改 ACL,然后使用 Set-Acl 将更改写回磁盘。

使用 PowerShell 添加 NTFS 权限

我们脚本的最后一个组成部分是将权限分配给我们将用于管理访问的组,而不是向单个用户分配权限。

这是使用以下 PowerShell 命令完成的:

$FolderPath = "c:\ms_tmp\Projects\P0001-P0050\Mars_Data"
$Acl = Get-Acl -Path $FolderPath
$Ace = New-Object System.Security.AccessControl.FileSystemAccessRule("easy365manager\DL.Mars_Data.Modify", 'Modify', 'ContainerInherit, ObjectInherit', 'None', 'Allow')
$Acl.AddAccessRule($Ace)
Set-Acl -Path $FolderPath -ACLObject $Acl

要分配权限,我们首先需要构建一个反映我们要分配的权限的 ACE。

参数包括受让人、权限类型、继承标志、传播标志和类型(允许/拒绝)。

同样,我们在进行更改之前使用 Get-Acl 读取 ACL,并使用 Set-Acl 写入 ACL。

最终剧本

为了清理我们的脚本,我们合并了更改,因此我们只需读取和写入 ACL 一次。

最终脚本如下所示:

$FolderPath = "c:\ms_tmp\Projects\P0001-P0050\Mars_Data"
$Acl = Get-Acl -Path $FolderPath
# Remove non-inherited permissions
ForEach ($Ace In $Acl.Access) {
    If ($Ace.IsInherited -eq $false) {
        $Acl.RemoveAccessRuleSpecific($Ace)
    }
}
# Enable inheritance
$Acl.SetAccessRuleProtection($false, $false)
# Assign Modify to new group
$Ace = New-Object System.Security.AccessControl.FileSystemAccessRule("easy365manager\DL.Mars_Data.Modify", 'Modify', 'ContainerInherit, ObjectInherit', 'None', 'Allow')
    $Acl.AddAccessRule($Ace)
Set-Acl -Path $FolderPath -ACLObject $Acl

运行脚本后,权限设置完全符合我们的要求:

[玩转系统] 获取 ACL 和设置 ACL

通过 Active Directory 进行集中管理

现在我们已经从 AD 实现了文件权限的集中管理。

我们现在可以依靠修改 AD 中的组成员身份,而不必直接修改源(文件夹/文件系统)上的权限。非常便利!

但您是否知道您还可以将 Office 365 管理整合到 Active Directory 中

借助革命性的 Office 365 管理工具 Easy365Manager,您可以直接从 AD 用户属性管理 Office 365 许可证和邮箱:

由于以下事实,全球各行业有数百家公司使用 Easy365Manager:

  • 从 AD 工作,无需使用许多 Office 365 Web 控制台,可以节省大量时间。
  • Easy365Manager 的安装非常简单(不到一分钟)。
  • Easy365Manager 为许多通常只能通过 PowerShell 执行的任务提供了 GUI。
  • 您的基础设施没有变化(零风险)。
  • 最后,Easy365Manager 允许您删除本地 Exchange(节省大量成本)。

您可以在此处下载 30 天的全功能试用版。

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

取消回复欢迎 发表评论:

关灯