【问题标题】:Adding ACL rule to folder overwrites all rules将 ACL 规则添加到文件夹会覆盖所有规则
【发布时间】:2016-08-29 14:18:30
【问题描述】:

我需要解决的问题是我需要在网络共享上为新创建的用户创建一个文件夹。这是由 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

编辑1:
使用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

【问题讨论】:

  • 您发布的代码已注释SetAccessRulProtection(),因此不应删除现有的ACL。此外,如果这样做的目的是创建用户主目录,您可能需要查看this
  • 它不适用于主目录,仅用于共享文件夹。他们通过 GPO 访问它。这是故意注释掉的,因为它最后说即使这样也行不通。
  • 重复我自己:由于您不使用SetAccessRulProtection(),您的代码不会删除现有的 ACL。
  • 也在重复我自己。使用SetAccessRuleProtection() 没有帮助。
  • 没有人告诉你无论如何都要使用它。

标签: powershell permissions automation directory acl


【解决方案1】:

除了(现已注释的)行之外,您的代码中没有任何内容可以删除 ACL

#$orignalACL.SetAccessRuleProtection($True,$False)

该行将删除继承的 ACL,所以它当然无济于事。

来自documentation

语法

public void SetAccessRuleProtection(
    bool isProtected,
    bool preserveInheritance
)

参数

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

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

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

$orignalACL.SetAccessRuleProtection($false, $true)

【讨论】:

  • 像你说的那样改变了我的代码。取消注释该 1 行并将其更改为 $originalACL.SetAccessRuleProtection($false,$true) 但这仍然没有帮助。
【解决方案2】:

这段代码对我有用:

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

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

【讨论】:

    【解决方案3】:

    问题出在这里:

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

    改成这样:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-17
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多