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
,请使用 Path 或 InputObject 参数标识要更改安全描述符的项。 然后,使用 AclObject 或 SecurityDescriptor 参数提供具有要应用的值的安全描述符。 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,在此示例中,即为保存在 $DogACL
变量中的 Dog.txt 的 ACL。
示例 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-Acl
将 Dog.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 参数将获取本来会被排除的隐藏文件。 (因为 Recurse 参数对目录有效,对文件无效,所以不能使用 c:\temp\*.txt
。)
管道运算符 (|
) 将表示检索到的文件的对象发送到 Set-Acl
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。 命令完成后,从 Pets 文件夹中继承的 Dog.txt 的 ACL 将直接应用于 Dog.txt,添加到 Pets 的新访问策略不会更改对 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
$fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList
# 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
更改由 Path 或 InputObject 参数指定的项的 ACL,以匹配指定安全对象中的值。
可以在变量中保存 Get-Acl
命令的输出,然后使用 AclObject 参数传递变量,或键入 Get-Acl
命令。
类型: | Object |
Position: | 1 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-ClearCentralAccessPolicy
从指定项中删除中心访问策略。
从 Windows Server 2012 开始,管理员可使用 Active Directory 和组策略为用户和组设置中心访问策略。 有关详细信息,请参阅动态访问控制:方案概述。
已在 Windows PowerShell 3.0 中引入了此参数。
类型: | SwitchParameter |
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
(通过使用 AclObject 或 SecurityDescriptor 参数,或者通过将安全对象从 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 |
输入
可以通过管道将 ACL 对象传递给此 cmdlet。
可以通过管道将安全描述符传递给此 cmdlet。
输出
None
默认情况下,此 cmdlet 不返回任何输出。
如果使用 PassThru 参数,则此 cmdlet 将返回安全对象。 安全对象的类型取决于项的类型。
备注
此 cmdlet 仅在 Windows 平台上可用。
PowerShell 文件系统和注册表提供程序支持 Set-Acl
cmdlet。 因此,可以使用它来更改文件、目录和注册表项的安全描述符。