更改ACL-递归所有目录Powershell

更改ACL-递归所有目录Powershell,powershell,powershell-2.0,Powershell,Powershell 2.0,我被难住了 这是我需要做的。我们已经迁移到一个新的域,我基本上需要一个脚本,我们可以在服务器上运行,将重新诅咒所有目录和文件,查看每个目录和文件的ACL。它将在ACL中搜索OLDDOMAIN\USER等。如果找到,将ACL更改为NEWDOMAIN\USER,但保留所有权限 这是我到目前为止所拥有的 $access = "" $accessarray = @() $filesarray = @() $permarray = @() $filesarray = Get-ChildItem C:\Us

我被难住了

这是我需要做的。我们已经迁移到一个新的域,我基本上需要一个脚本,我们可以在服务器上运行,将重新诅咒所有目录和文件,查看每个目录和文件的ACL。它将在ACL中搜索OLDDOMAIN\USER等。如果找到,将ACL更改为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

谢谢

$ar=新对象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:不允许安全标识符是此对象的所有者。任何想法,我是如此接近:perfect我让它工作了一件事,它添加了一个新的访问规则,但留下了一个旧的域我如何删除它?