Verschieben Sie Berechtigungen für Basisordner in ein neues Active Directory

Nov 23 2020

Ich muss die Home-Ordner für mehr als 100 Benutzer von einem AD in einen anderen verschieben. Der samAccountName für jeden Benutzer ist in beiden ADs gleich, aber die ObjectGUID unterscheidet sich, da die Benutzer mit einer CSV-Datei und nicht mit einer Vertrauensstellung exportiert und importiert wurden.

Das Kopieren ist kein wirkliches Problem - ich glaube, ich habe eine funktionierende Robocopy-Linie, aber ich mache mir mehr Sorgen darüber, nach dem Verschieben Berechtigungen für die Ordner festzulegen. Ich möchte über jeden Home-Ordner iterieren und dem Benutzer, dessen samAccountName mit dem Ordnernamen übereinstimmt, Besitz und volle Kontrolle zuweisen.

Ich bin jedoch mit den Powershell Get-ACL- und Set-ACL-Befehlen nicht ganz zufrieden. Wenn ich es richtig verstehe, muss ich zuerst die ACL aus einem Ordner in eine Variable holen, dann die Berechtigungen für die Variable bearbeiten und dann die richtigen Berechtigungen mit Set-ACL anwenden.

So wie ich es mir vorstelle:

  1. Get-ACL von einem Ordner zu $ ​​UserACL
  2. Rufen Sie den Namen eines Benutzerordners ab
  3. Überprüfen Sie, ob ich einen Ordnernamen mit einem samAccountName abgleichen kann
  4. Wenn ja, fügen Sie die Benutzerberechtigungen zur $ UserACL hinzu
  5. Legen Sie die Berechtigungen für den Ordner fest, indem Sie Set-ACL für den Benutzerordner ausführen
  6. Wenn keine Übereinstimmung vorliegt, legen Sie die Berechtigungen so fest, dass nur Administratoren Zugriff auf den Ordner haben (es gibt eine Reihe inaktiver Konten, die nicht einfach gelöscht werden können).

Pseudocode:

$baseACL = Get-ACL -Path [ExampleDir] $HomeFolders = Get-ChildItem [RootDir] | Where-Object {$_.PSIsContainer} | Foreach-Object {$_.Name}
$ADUsers=Import-csv 'UserCSV.csv' -Delimiter ';' Foreach ($Folder in $HomeFolders) { ForEach ($User in $ADUsers) { if ($Folder -eq $($User.samAccountName)) {
      # Set properties
      $useridentity = "[AD]\$Folder"
      $admidentity = "BUILTIN\Administrators" $fileSystemRights = "FullControl"
      $type = "Allow" # Create new rule $fileSystemAccessRuleArgumentList = $useridentity, $admidentity, $fileSystemRights, $type
      $fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList
      # Apply new rule
      $baseACL.SetAccessRule($fileSystemAccessRule)
      Set-Acl -Path "[Path]\$Folder" -AclObject $baseACL
    }
    Else {
      $admidentity = "BUILTIN\Administrators" $fileSystemRights = "FullControl"
      $type = "Allow" # Create new rule $fileSystemAccessRuleArgumentList = $admidentity, $fileSystemRights, $type $fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList # Apply new rule $baseACL.SetAccessRule($fileSystemAccessRule) Set-Acl -Path "[Path]\$Folder" -AclObject $baseACL
    }
  }
}

Hiermit werden nur Berechtigungen festgelegt, keine Eigentumsrechte. Daher bin ich mir nicht sicher, ob dies mit Powershell auf Anhieb überhaupt möglich ist. Oder muss ich mir Cacls und Takeown ansehen?

Antworten

Laage Dec 09 2020 at 17:26

Ich habe hier eine Lösung gefunden, die mit ein wenig Optimierung für mich funktioniert hat: HALP! Ich habe einen Berechtigungs-Albtraum für umgeleitete Ordner / Home-Verzeichnisse geerbt

Mein fertiges Skript sieht meistens so aus:

#requires -PSEdition Desktop
#requires -version 5.1
#requires -Modules ActiveDirectory
#requires -RunAsAdministrator

[CmdLetBinding()]
Param ()

$AD = [DOMAIN CONTROLLER] $Root = [HOME DIRECTORY]

$Paths = Get-ChildItem $Root -Directory | Select-Object -Property Name,FullName

# Local Admin access rule
$LASID = Get-LocalGroup -Name 'Administrators' | Select-Object -ExpandProperty SID $LAAR = New-Object System.Security.AccessControl.FileSystemAccessRule($LASID, "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow") # Domain Admin access rule $DASID = Get-ADGroup -Server $AD -Filter { Name -eq 'Domain Admins' } | Select-Object -ExpandProperty SID $DAAR = New-Object System.Security.AccessControl.FileSystemAccessRule($DASID, "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow") # System Access rule $SysAR = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")

Try {
  foreach ($Directory in $Paths) {
    $samExists = $(try {Get-ADUser -Server $AD -Identity $($Directory.Name)} catch {$null})
    if ($samExists -ne $null) {
      # For error handling purposes - not all folders will map to a user of the exact same name
      Write-Output "Creating User ACL for $($Directory.FullName) ... "
      
      # Creates a blank ACL object to to add access rules into, also blanks out the ACL for each iteration of the loop
      $ACL = New-Object System.Security.AccessControl.DirectorySecurity # Creating the right type of user object to feed into our ACL and populating it with the user whose folder we're currently on $UserSID = Get-ADUser -Server $AD -Identity $($Directory.Name) | Select-Object -ExpandProperty SID # $objUser = New-Object System.Security.Principal.NTAccount($UserSID) # Access rule for the user whose folder we're dealing with this iteration $UserAR = New-Object System.Security.AccessControl.FileSystemAccessRule($UserSID, "FullControl","ContainerInherit,ObjectInherit", "None", "Allow") # Change the inheritance, propagation settings for the folder we're dealing with $ACL.SetOwner($UserSID) $ACL.SetAccessRuleProtection($true,$false)

      $ACL.SetAccessRule($UserAR)
      $ACL.SetAccessRule($LAAR)
      $ACL.SetAccessRule($DAAR)
      $ACL.SetAccessRule($SysAR)

      # For error handling purposes - not all folders will map to a user of the exact same name
      $ACL | Format-List Set-Acl -Path $Directory.FullName -AclObject $ACL } else { # For error handling purposes - not all folders will map to a user of the exact same name Write-Warning "Creating Admin ACL for $($Directory.FullName) ... " # Creates a blank ACL object to to add access rules into, also blanks out the ACL for each iteration of the loop $ACL = New-Object System.Security.AccessControl.DirectorySecurity

      # Creating the right type of user object to feed into our ACL and populating it with the user whose folder we're currently on
      # $objUser = New-Object System.Security.Principal.NTAccount($DASID)

      # Change the inheritance, propagation settings for the folder we're dealing with
      $ACL.SetOwner($DASID)
      $ACL.SetAccessRuleProtection($true,$false) $ACL.SetAccessRule($LAAR) $ACL.SetAccessRule($DAAR) $ACL.SetAccessRule($SysAR) # For error handling purposes - not all folders will map to a user of the exact same name $ACL | Format-List

      Set-Acl -Path $Directory.FullName -AclObject $ACL
    }
  }
}

Catch {
  Write-Host -BackgroundColor Red "Error: $($_.Exception)"
  Break
}