【问题标题】:PowerShell SetAccessRule for ACL failingACL 的 PowerShell SetAccessRule 失败
【发布时间】:2019-03-25 13:32:35
【问题描述】:

我完成的脚本创建了一个文件夹和安全组,稍后将其添加到具有特殊权限的相关文件夹中。问题是脚本在“$acl.SetAccessRule($rule_modify)”上失败并抱怨身份。

错误: “使用“1”个参数调用“SetAccessRule”的异常:“无法翻译部分或全部身份引用。”

如果我通过简单地从 ISE 复制/粘贴到常规 PowerShell 窗口中逐行运行脚本,则使用相同的位置和用户,一切都会顺利进行。

这是不起作用的重要部分。

#Get ACL list
$acl = Get-Acl -Path $Path 
$acl.SetAccessRuleProtection($false,$false)

#Add permission for modify
$set_modify = "INTRA\FIL_$($Department)_$($Group)_Modify", 'DeleteSubdirectoriesAndFiles, Write, ReadAndExecute, Synchronize', 'ContainerInherit, ObjectInherit', 'None', 'Allow'
$rule_modify = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $set_modify
$acl.SetAccessRule($rule_modify)
$acl | Set-Acl $path

【问题讨论】:

    标签: powershell acl


    【解决方案1】:

    我遇到了基本相同的问题,但使用的是“AddAccessRule”。

    $Acl.AddAccessRule($Ar)
    

    我的脚本因上述错误而失败。 正如 Patrik Persson 所提到的,在我的情况下,这也是因为 AD 显示新组的速度很慢,并且在安全组出现在我的 AD 中之前无法添加 Ar。

    所以我在我想要分享的脚本中添加了一个带有 do/until 循环的 try/catch:

    do {
      $check = 'ok'
      try {
        $Acl.AddAccessRule($Ar)
      } catch [System.Management.Automation.RuntimeException] {
        $_.Exception.Message
        $check = 'error'
        Start-Sleep -Seconds 2
      }
    } until (
      $check -eq 'ok'
    )
    

    因此循环继续,直到 AD 正确注册安全组。之后,将 Ar 添加到 acl 中,我的脚本按预期继续。

    【讨论】:

      【解决方案2】:

      您可能希望将用于构建安全组名称的所有字符串扩展为一个干净的变量 - 我发现这可能很棘手。确保$secgroup 在构造时包含正确的字符串值。

      您也可以在一行上创建规则和对象类型。

      $secgroup = "INTRA\FIL_$($Department)_$($Group)_Modify"
      $modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($secgroup,'DeleteSubdirectoriesAndFiles, Write, ReadAndExecute, Synchronize','ContainerInherit, ObjectInherit','None','Allow')
      

      顺便说一句,如果本质上您希望您的用户对内容具有修改权限而不能删除父文件夹,那么如果您设置 InheritOnly 标志(我还没有测试过),它应该可以工作。

      $modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($secgroup,'Modify, Synchronize', 'ContainerInherit, ObjectInherit','InheritOnly','Allow')
      

      【讨论】:

      • 刚刚尝试了您的解决方案,不幸的是我遇到了同样的问题。 “身份参考”是按预期运行脚本时出现的错误,但在逐行手动复制/粘贴时工作正常。
      【解决方案3】:

      我找到了解决方案,但它失败了,因为 ActiveDirectory 太慢,无法识别安全组是在将其添加到 ACL 之前创建的。

      我采用的解决方案是在创建组和文件夹后添加 10 秒睡眠,现在它可以按预期工作。

      【讨论】:

      • 该死,希望我能想到这一点 - 遇到了同样的问题,尤其是在远程文件服务器上创建文件夹时。
      【解决方案4】:

      在远程文件服务器上创建共享时遇到了类似问题。

      起初,我使用了建议的解决方案(start-sleep),但它不够好,因为它在处理大量共享时显着增加了消耗的时间。

      事实证明,您可以在定义 ACE 时使用 SID,并且操作是即时的:

      $TempSID = (Get-ADGroup "FIL_$($Department)_$($Group)_Modify").SID
      $PermissionModify = "Write, Read, ListDirectory, ReadAndexecute, DeleteSubdirectoriesAndFiles"
      $Inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
      $Propagation = [system.security.accesscontrol.PropagationFlags]"None"
      $Type = "Allow"
      
      $modifyRule = New-Object System.Security.AccessControl.FileSystemAccessRule($TempSID, $PermissionModify, $Inherit, $Propagation, $Type)
      

      似乎 Active Directory 需要一些时间(在我的情况下为 2 秒)将 SID 转换为组名(以 DOMAIN\groupName 格式)。

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2020-09-28
        • 2020-04-24
        • 1970-01-01
        • 2021-04-20
        • 2020-03-24
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多