Set-Acl

更改指定项(如文件或注册表项)的安全描述符。

语法

Set-Acl
   [-Path] <String[]>
   [-AclObject] <Object>
   [-ClearCentralAccessPolicy]
   [-PassThru]
   [-Filter <String>]
   [-Include <String[]>]
   [-Exclude <String[]>]
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]
Set-Acl
   [-InputObject] <PSObject>
   [-AclObject] <Object>
   [-PassThru]
   [-Filter <String>]
   [-Include <String[]>]
   [-Exclude <String[]>]
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]
Set-Acl
   -LiteralPath <String[]>
   [-AclObject] <Object>
   [-ClearCentralAccessPolicy]
   [-PassThru]
   [-Filter <String>]
   [-Include <String[]>]
   [-Exclude <String[]>]
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]

说明

此 cmdlet 仅在 Windows 平台上可用。

Set-Acl cmdlet 更改指定项(如文件或注册表项)的安全描述符,以匹配你提供的安全描述符中的值。

若要使用 Set-Acl,请使用 PathInputObject 参数来标识要更改其安全描述符的项。 然后,使用 AclObjectSecurityDescriptor 参数来提供具有要应用的值的安全描述符。 Set-Acl 应用提供的安全描述符。 它使用 AclObject 参数的值作为模型,并更改项的安全描述符中的值以匹配 AclObject 参数中的值。

示例

示例 1:将安全描述符从一个文件复制到另一个文件

$DogACL = Get-Acl -Path "C:\Dog.txt"
Set-Acl -Path "C:\Cat.txt" -AclObject $DogACL

这些命令将 Dog.txt 文件的安全描述符中的值复制到 Cat.txt 文件的安全描述符。 命令完成后,Dog.txt 和 Cat.txt 文件的安全描述符是相同的。

第一个命令使用 Get-Acl cmdlet 来获取 Dog.txt 文件的安全描述符。 赋值运算符(=)将安全描述符存储在 $DogACL 变量的值中。

第二个命令使用 Set-Acl 将 Cat.txt ACL 中的值更改为 $DogACL中的值。

Path 参数的值是 Cat.txt 文件的路径。 AclObject 参数的值是模型 ACL,在本例中,Dog.txt 的 ACL 保存在 $DogACL 变量中。

示例 2:使用管道运算符传递描述符

Get-Acl -Path "C:\Dog.txt" | Set-Acl -Path "C:\Cat.txt"

此命令与上一示例中的命令几乎相同,只不过它使用管道运算符(|)将安全描述符从 Get-Acl 命令发送到 Set-Acl 命令。

第一个命令使用 Get-Acl cmdlet 来获取 Dog.txt 文件的安全描述符。 管道运算符(|)将表示 Dog.txt 安全描述符的对象传递给 Set-Acl cmdlet。

第二个命令使用 Set-AclDog.txt 的安全描述符应用于 Cat.txt。 命令完成后,Dog.txt 和 Cat.txt 文件的 ACL 相同。

示例 3:将安全描述符应用于多个文件

$NewAcl = Get-Acl File0.txt
Get-ChildItem -Path "C:\temp" -Recurse -Include "*.txt" -Force | Set-Acl -AclObject $NewAcl

这些命令将 File0.txt 文件中的安全描述符应用于 C:\Temp 目录及其所有子目录中的所有文本文件。

第一个命令获取当前目录中 File0.txt 文件的安全描述符,并使用赋值运算符(=)将其存储在 $NewACL 变量中。

管道中的第一个命令使用 Get-ChildItem cmdlet 获取 C:\Temp 目录中的所有文本文件。 Recurse 参数将命令扩展到 C:\temp的所有子目录。 Include 参数将检索到的文件限制为文件扩展名为 .txt 的文件。 Force 参数将获取本来会被排除的隐藏文件。 (不能使用 c:\temp\*.txt,因为 Recurse 参数适用于目录而不是文件。

管道运算符(|)将表示检索的文件的对象发送到 Set-Acl cmdlet,该 cmdlet 将 AclObject 参数中的安全描述符应用于管道中的所有文件。

在实践中,最好将 WhatIf 参数与可能影响多个项的所有 Set-Acl 命令一起使用。 在此示例中,管道中的第二个命令将为 Set-Acl -AclObject $NewAcl -WhatIf。 此命令列出受该命令影响的文件。 查看结果后,无需 WhatIf 参数即可再次运行该命令。

示例 4:禁用继承并保留继承的访问规则

$NewAcl = Get-Acl -Path "C:\Pets\Dog.txt"
$isProtected = $true
$preserveInheritance = $true
$NewAcl.SetAccessRuleProtection($isProtected, $preserveInheritance)
Set-Acl -Path "C:\Pets\Dog.txt" -AclObject $NewAcl

这些命令禁用父文件夹的访问继承,同时仍保留现有的继承访问规则。

第一个命令使用 Get-Acl cmdlet 来获取 Dog.txt 文件的安全描述符。

接下来,将创建变量以将继承的访问规则转换为显式访问规则。 若要保护与此关联的访问规则免受继承,请将 $isProtected 变量设置为 $true。 若要允许继承,请将 $isProtected 设置为 $false。 有关详细信息,请参阅设置访问规则保护

$preserveInheritance 变量设置为 $true 以保留继承的访问规则或 $false 以删除继承的访问规则。 然后使用 SetAccessRuleProtection() 方法更新访问规则保护。

最后一个命令使用 Set-Acl 将安全描述符应用于 Dog.txt。 命令完成后,从“宠物”文件夹中继承的 Dog.txt 的 ACL 将直接应用于 Dog.txt,添加到“宠物”的新访问策略不会更改对 Dog.txt的访问权限。

示例 5:授予管理员对文件的完全控制

$NewAcl = Get-Acl -Path "C:\Pets\Dog.txt"
# Set properties
$identity = "BUILTIN\Administrators"
$fileSystemRights = "FullControl"
$type = "Allow"
# Create new rule
$fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type
$newParams = @{
  TypeName     = 'System.Security.AccessControl.FileSystemAccessRule'
    ArgumentList = $fileSystemAccessRuleArgumentList
}
$fileSystemAccessRule = New-Object @newParams
# Apply new rule
$NewAcl.SetAccessRule($fileSystemAccessRule)
Set-Acl -Path "C:\Pets\Dog.txt" -AclObject $NewAcl

此命令将授予 BUILTIN\Administrators 组完全控制 Dog.txt 文件。

第一个命令使用 Get-Acl cmdlet 来获取 Dog.txt 文件的安全描述符。

创建下一个变量以授予 BUILTIN\Administrators 组对 Dog.txt 文件的完全控制。 将 $identity 变量设置为 用户帐户的名称$fileSystemRights 变量设置为 FullControl,并且可以是任何一个 FileSystemRights 值,这些值指定了与访问规则相关联的操作类型。 $type 变量设置为“Allow”以指定是否允许或拒绝该操作。 $fileSystemAccessRuleArgumentList 变量是一个参数列表,在创建新的 FileSystemAccessRule 对象时传递。 然后创建一个新的 FileSystemAccessRule 对象,并将 FileSystemAccessRule 对象传递给 SetAccessRule() 方法,添加新的访问规则。

最后一个命令使用 Set-Acl 将安全描述符应用于 Dog.txt。 命令完成后,BUILTIN\Administrators 组将完全控制 Dog.txt

参数

-AclObject

指定具有所需属性值的 ACL。 Set-Acl 更改由 PathInputObject 参数指定的项的 ACL,以匹配指定安全对象中的值。

可以在变量中保存 Get-Acl 命令的输出,然后使用 AclObject 参数传递变量,或键入 Get-Acl 命令。

类型:Object
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-ClearCentralAccessPolicy

从指定项中删除中央访问策略。

从 Windows Server 2012 开始,管理员可以使用 Active Directory 和组策略为用户和组设置中央访问策略。 有关详细信息,请参阅 动态访问控制:方案概述

此参数是在 Windows PowerShell 3.0 中引入的。

类型:SwitchParameter
别名:PSPath, LP
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Confirm

在运行 cmdlet 之前,提示你进行确认。

类型:SwitchParameter
别名:cf
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Exclude

省略指定的项。 此参数值使 Path 参数有效。 输入路径元素或模式,例如 *.txt。 允许使用通配符。

类型:String[]
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:True

-Filter

以提供程序的格式或语言指定筛选器。 此参数的值用于限定 Path 参数。 筛选器的语法(包括通配符的使用)取决于提供程序。 筛选器比其他参数更有效,因为提供程序在检索对象时应用它们,而不是在检索对象后让 PowerShell 筛选对象。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:True

-Include

仅更改指定的项。 此参数值使 Path 参数有效。 输入路径元素或模式,例如 *.txt。 允许使用通配符。

类型:String[]
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:True

-InputObject

更改指定对象的安全描述符。 输入包含对象或获取对象的命令的变量。

不能通过管道将要更改的对象传递给 Set-Acl。 而是在命令中显式使用 InputObject 参数。

此参数是在 Windows PowerShell 3.0 中引入的。

类型:PSObject
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-LiteralPath

更改指定项的安全描述符。 与 Path不同,LiteralPath 参数的值被完全按照键入时的方式使用。 不会将任何字符解释为通配符。 如果路径包含转义字符,请将它括在单引号(')。 单引号告知 PowerShell 不要将任何字符解释为转义序列。

此参数是在 Windows PowerShell 3.0 中引入的。

类型:String[]
别名:PSPath
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-PassThru

返回一个对象,该对象表示已更改的安全描述符。 默认情况下,此 cmdlet 不生成任何输出。

类型:SwitchParameter
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Path

更改指定项的安全描述符。 输入项的路径,例如文件或注册表项的路径。 允许使用通配符。

如果将安全对象传递给 Set-Acl(通过使用 AclObjectSecurityDescriptor 参数或将安全对象从 Get-Acl 传递到 Set-Acl),并且省略了 Path 参数(名称和值),Set-Acl 使用安全对象中包含的路径。

类型:String[]
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:True

-WhatIf

显示 cmdlet 运行时会发生什么情况。 cmdlet 未运行。

类型:SwitchParameter
别名:wi
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

输入

ObjectSecurity

可以通过管道将 ACL 对象传递给此 cmdlet。

CommonSecurityDescriptor

可以通过管道将安全描述符传递给此 cmdlet。

输出

None

默认情况下,此 cmdlet 不返回任何输出。

FileSecurity

使用 PassThru 参数时,此 cmdlet 将返回安全对象。 安全对象的类型取决于项的类型。

备注

此 cmdlet 仅在 Windows 平台上可用。

PowerShell 文件系统和注册表提供程序支持 Set-Acl cmdlet。 因此,可以使用它更改文件、目录和注册表项的安全描述符。