更改ACL - 递归所有目录PowerShell

4

我被难住了!

以下是我的需求。我们已经迁移到一个新域,我需要编写一个脚本,在服务器上运行此脚本,该脚本将递归遍历所有目录和文件,并查看每个目录或文件的ACL。如果在ACL中发现“OLDDOMAIN\USER”等内容,则将其替换为“NEWDOMAIN\USER”,但保留所有权限。

以下是我目前的代码:

$access = ""
$accessarray = @()
$filesarray = @()
$permarray = @()
$filesarray = Get-ChildItem C:\Users -Recurse
ForEach($path in $filesarray) {
  $pathcheck = $path.fullname
  $access = get-acl $pathcheck
  $accessarray = $access.AccessToString.Split(",")

  foreach ($item in $accessarray) {
    if ($item -match "OLDDOMAIN") {
      Write-Host $pathcheck
      Write-Host $item
      $item = $item -replace ("OLDDOMAIN","NEWDOMAIN")
      $permarray = $item.split(” “) | where-object {$_ -ne ”“}

      foreach($perm in $permarray) {
        $ar = New-Object system.security.accesscontrol.filesystemaccessrule $perm
        $acl.SetAccessRule($ar)
        $acl | Set-Acl $pathcheck
      }
    }
  }
}

这个方法有点可行,但问题在于当重新应用权限时,数组的顺序不正确,并且在set-acl命令失败。

有什么想法吗?我都快被搞疯了 :P

谢谢

1个回答

3

$ar = New-Object system.security.accesscontrol.filesystemaccessrule $perm

FileSystemAccessRule的构造函数需要3个参数,经过你的拆分和foreach后,$perm只有一个参数,因此该构造将失败。

避免使用拆分等操作,PowerShell为您提供了对象。对它们进行操作,不要获取字符串,然后再进行拆分等操作。

您可以使用以下代码实现所需操作:

gci c:\users -recurse | %{
    $acl = get-acl $_.fullname

    $acl.Access | ?{$_.IdentityReference.Value.StartsWith("OLDDOMAIN")} | %{

        $identity = $_.IdentityReference.Value -replace "OLDDOMAIN", "NEWDOMAIN"
        $permission = $identity,$_.FileSystemRights,$_.AccessControlType
        $ar = New-Object system.security.accesscontrol.filesystemaccessrule $permission
        $acl.SetAccessRule($ar)

    }

    $acl | set-acl $_.fullname
}

现在出现以下错误:Set-Acl:安全标识符不允许成为此对象的所有者。有什么想法,我离成功很近了:P - Chris Day
完美,我搞定了。 还有一件事,它正在添加一个新的访问规则,但是保留了旧域的规则。 我该如何删除它? - Chris Day

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接