使用 set-acl 和 powershell 设置继承和传播标志

Posted

技术标签:

【中文标题】使用 set-acl 和 powershell 设置继承和传播标志【英文标题】:Setting Inheritance and Propagation flags with set-acl and powershell 【发布时间】:2011-03-17 23:52:33 【问题描述】:

我试图模仿右键单击文件夹、在文件夹上设置“修改”以及将权限应用于特定文件夹、子文件夹和文件的操作。

我大部分时间都在使用 Powershell,但是继承只是设置为“子文件夹和文件”,而不是整个“此文件夹、子文件夹和文件”。

是否有一些未列出的 System.Security.AccessControl.PropagationFlags 标志可以正确设置?

这是我目前正在使用的。

$Folders = Get-childItem c:\TEMP\
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::InheritOnly
$objType = [System.Security.AccessControl.AccessControlType]::Allow 

foreach ($TempFolder in $Folders)

echo "Loop Iteration"
$Folder = $TempFolder.FullName

$acl = Get-Acl $Folder
$permission = "domain\user","Modify", $InheritanceFlag, $PropagationFlag, $objType
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

$acl.SetAccessRule($accessRule)
Set-Acl $Folder $acl
 

【问题讨论】:

我做了一个文件权限对话框和结果权限之间的映射图表:bit.ly/inheritMatrix 请添加您所做的以下代码中的修改以使其正常工作 【参考方案1】:

这是一个表格,可帮助您找到不同权限组合所需的标志。

╔═════════════╦═════════════╦═════════════════════════ ═════════════╦════════════════════════╦═══════════ ═══════╦═══════════════════════╦═════════════╦════ ═════════╗ ║ ║ 仅文件夹 ║ 文件夹、子文件夹和文件 ║ 文件夹和子文件夹 ║ 文件夹和文件 ║ 子文件夹和文件 ║ 子文件夹 ║ 文件 ║ ╠═════════════╬═════════════╬═════════════════════ ══════════╬════════════════════════╬══════════════ ════╬═══════════════════════╬═════════════╬═══════ ══════╣ ║ 传播 ║ 无 ║ 无 ║ 无 ║ 无 ║ InheritOnly ║ InheritOnly ║ InheritOnly ║ ║ 继承 ║ 无 ║ 容器|对象 ║ 容器 ║ 对象 ║ 容器|对象 ║ 容器 ║ 对象 ║ ╚═════════════╩═════════════╩═════════════════════ ══════════╩════════════════════════╩══════════════ ════╩═══════════════════════╩═════════════╩═══════ ══════╝

所以,as David said,你会想要

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit PropagationFlags.None

【讨论】:

表格+1。如果我能的话,只会为画框字符提供额外的 +1 :) 为什么文件夹/文件与子文件夹/文件在继承中不同?【参考方案2】:

我认为您的答案可以在this page 上找到。从页面:

此文件夹、子文件夹和文件:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None

【讨论】:

能否添加代码?链接到页面并引用 IMO 不是正确的答案。【参考方案3】:

这里有一些简洁的 Powershell 代码,通过修改文件夹的现有 ACL(访问控制列表)来应用新权限。

# Get the ACL for an existing folder
$existingAcl = Get-Acl -Path 'C:\DemoFolder'

# Set the permissions that you want to apply to the folder
$permissions = $env:username, 'Read,Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow'

# Create a new FileSystemAccessRule object
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permissions

# Modify the existing ACL to include the new rule
$existingAcl.SetAccessRule($rule)

# Apply the modified access rule to the folder
$existingAcl | Set-Acl -Path 'C:\DemoFolder'

$permissions 变量列表中的每个值都与FileSystemAccessRule 类的this constructor 参数有关。

感谢this page。

【讨论】:

powershell 的关键是将标志作为参数传递给 FileSystemAccessRule 的构造函数(即 New-Object),仅此答案所示。 @bchurchill 等等,但是 ACL 和 ACE 级别的继承/传播之间存在差异。所以在 FileSystemAccessRule 的 ctor 中设置它会影响 ACE,但不会影响 ACL 标志。或者我错过了什么? 我认为你是对的,这里的答案只是添加了一个设置了这些标志的新条目,这可能在某些情况下有效,但在其他情况下无效。【参考方案4】:

不要仅仅因为您在 PowerShell 中而忘记了优秀的 ol' exe。有时他们可以提供最简单的解决方案,例如:

icacls.exe $folder /grant 'domain\user:(OI)(CI)(M)'

【讨论】:

是的,我几乎解决了 DOS 批处理文件和 icacls 或 setacl 的问题,但尝试学习 powershell.. 最好的学习方法是解决问题等。 我明白了。 OTOH 我已经使用 PowerShell 超过 5 年了,如果它比等效的 PowerShell 容易得多,我会毫不犹豫地退回到 EXE。 IOW 在 PowerShell 中有很多要学习的东西 - 有些比其他的更有价值。 :-) icacls 令人讨厌的部分似乎是它使用了旧版本/SDDL 方言。【参考方案5】:

这里是the MSDN page,描述了这些标志以及它们各种组合的结果。

Flag combinations => Propagation results
=========================================
No Flags => Target folder.
ObjectInherit => Target folder, child object (file), grandchild object (file).
ObjectInherit and NoPropagateInherit => Target folder, child object (file).
ObjectInherit and InheritOnly => Child object (file), grandchild object (file).
ObjectInherit, InheritOnly, and NoPropagateInherit => Child object (file).
ContainerInherit => Target folder, child folder, grandchild folder.
ContainerInherit, and NoPropagateInherit => Target folder, child folder.
ContainerInherit, and InheritOnly => Child folder, grandchild folder.
ContainerInherit, InheritOnly, and NoPropagateInherit => Child folder.
ContainerInherit, and ObjectInherit => Target folder, child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, and NoPropagateInherit => Target folder, child folder, child object (file).
ContainerInherit, ObjectInherit, and InheritOnly => Child folder, child object (file), grandchild folder, grandchild object (file).
ContainerInherit, ObjectInherit, NoPropagateInherit, InheritOnly => Child folder, child object (file).

要让它递归地对目录以及所有子目录和文件应用权限,您需要使用这些标志:

InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit 
PropagationFlags.None

因此,您需要为示例进行的具体代码更改是:

$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None

【讨论】:

以上是关于使用 set-acl 和 powershell 设置继承和传播标志的主要内容,如果未能解决你的问题,请参考以下文章

使用 powershell 更改权限不会传播给孩子

为啥驱动器根目录上的 Set-Acl 会尝试设置“对象”的所有权?

Powershell实战之脚本参数

如何使用 powershell 设置 IIS 的表单身份验证(system.web/authentication)的 overrideMode?

POWERSHELL.EXE进程经常将电脑内存耗尽。

powershell 使用PowerShell安装和更新NuGet