将ACL规则添加到文件夹会覆盖所有规则

时间:2016-05-04 08:47:08

标签: powershell permissions automation directory acl

我需要解决的问题是我需要在网络共享上为新创建的用户创建一个文件夹。这是由System Center Orchestrator完成的,在创建用户之后我需要复制具有特定权限的虚拟文件夹,在ACL中添加新创建的用户并从这些ACL中删除工作流帐户。 (创建文件夹的用户会自动添加。)

该文件夹成功创建并获得与虚拟文件夹相同的权限,现在我需要为这些权限添加1个ACL规则。

以下是我使用的示例代码:

$colRights = [System.Security.AccessControl.FileSystemRights]"Read, Write" 

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

$objType =[System.Security.AccessControl.AccessControlType]::Allow 

$objUser = New-Object System.Security.Principal.NTAccount("domain\createdUser1") 

$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule (
              $objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType
          )

$originalACL = Get-ACL "\\shares\createdUser1"
#$orignalACL.SetAccessRuleProtection($True,$False)#doesn't help either
$originalACL.AddAccessRule($objACE) 

Set-ACL "\\shares\createdUser1" $objACL

我遇到的唯一问题是它没有添加ACL规则,但它会覆盖此文件夹当前具有的所有规则。如何在不覆盖原始规则的情况下向现有ACL添加1条规则?

来源示例代码:https://technet.microsoft.com/en-us/library/ff730951.aspx

EDIT1:
使用https://blogs.technet.microsoft.com/heyscriptingguy/2014/11/22/weekend-scripter-use-powershell-to-get-add-and-remove-ntfs-permissions/上提供的模块也可以做同样的事情。我做错了吗?

$colRights = "Read, Write"
$objUser = New-Object System.Security.Principal.NTAccount("domain\createdUser1") 
Add-NTFSAccess -Path $folderPath -Account $objUser -AccessRights $colRights

3 个答案:

答案 0 :(得分:0)

除了(现在注释的)行

之外,代码中没有任何内容可以删除ACL
#$orignalACL.SetAccessRuleProtection($True,$False)

该行将删除继承的ACL,因此当然无济于事。

来自documentation

  

语法

public void SetAccessRuleProtection(
    bool isProtected,
    bool preserveInheritance
)
     

参数

     

isProtected
   true 保护与此ObjectSecurity对象关联的访问规则免于继承; false 以允许继承。

     

preserveInheritance
   true 以保留继承的访问规则; false 删除继承的访问规则。如果 isProtected false ,则忽略此参数。

我怀疑你之前曾经运行过该行,因此删除了继承的ACL。要纠正该错误,您需要先手动或通过调用SetAccessRuleProtection()并将第一个参数设置为$false来重新启用继承:

$orignalACL.SetAccessRuleProtection($false, $true)

答案 1 :(得分:0)

这段代码对我有用:

$colRights = "Read, Write"
$objUser = New-Object System.Security.Principal.NTAccount("domain\createdUser1") 
add-NTFSAccess -Path $folderPath -Account $objUser -AccessRights $colRights

我们从其他用户帐户运行它,突然代码工作了。这是通过在本地文件夹上测试脚本找到的。在这里它没有删除任何其他ACL。这可能是具有共享权限或安全权限的内容。 (本地我是完全管理员,但我不是。)

答案 2 :(得分:0)

问题在这里:

Set-ACL "\\shares\createdUser1" $objACL

更改为此:

Set-ACL "\\shares\createdUser1" $originalACL

您在运行$originalACL时修改了$originalACL.AddAccessRule($objACE)