Wijzig ACL - Recurse All Directories Powershell

Ik ben stumped!

Dit is wat ik moet doen. We zijn gemigreerd naar een nieuw domein, ik heb in principe een script nodig dat we kunnen uitvoeren op een server die alle mappen en bestanden opnieuw vervloekt door naar de ACL's voor elk domein te kijken. Het zoekt in de ACL naar OLDDOMAIN \ USER enz. Als dit wordt gevonden, wijzigt u de ACL in NEWDOMAIN \ USER, maar behoudt u alle machtigingen

Dit is wat ik tot nu toe heb gedaan

$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
      }
    }
  }
}

Het werkt een beetje, maar het probleem is dat wanneer de rechten opnieuw worden toegepast de array niet in de juiste volgorde staat en deze mislukt bij de opdracht set-acl

Om het even welke ideeën? Mijn haar hier uittrekken: P

Bedankt

4

1 antwoord

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

De constructor voor FileSystemAccessRule neemt 3 argumenten, en na al uw splitsen en foreach, zal $ perm slechts één argument hebben en zal de constructie zelf falen.

Vermijd de splits enz. Powershell biedt u objecten. Werk op hen. Geen snaren krijgen, dan splitsen etc.

Je kunt doen wat je wilt met zoiets als dit:

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
}
3
toegevoegd
Bedankt man, moet je echt meer naar Powershell kijken
toegevoegd de auteur Chris Day, de bron
Nu de volgende fout krijgen Set-Acl: de beveiligings-ID mag niet de eigenaar van dit object zijn. Alle ideeën, ik ben zo dichtbij: P
toegevoegd de auteur Chris Day, de bron
Perfect Ik heb het laten werken Nog een ding, het toevoegen van een nieuwe toegangsregel maar het verlaten van het oude domein. Hoe zou ik het verwijderen?
toegevoegd de auteur Chris Day, de bron
Heb het aan het werk Bedankt voor al uw hulp!
toegevoegd de auteur Chris Day, de bron