Aktionen

PowerShell Userhome Benutzerordner Rechte neu setzen

Aus znilwiki

Changelog:

  • 20.07.2023 erste Version

Problem

Ich habe die Homelaufwerk-Ordner aller Benutzer an einen neuen Ort kopiert (per robocopy).
Da die Rechte vorher schon nicht sauber waren habe ich diese extra ohne ACL kopiert (/COPY:DATO).
Nun hatte ich 650 Ordner die hießen wie der Anmeldename der Benutzer (%USERNAME%), aber ohne Rechte.


Lösung

Ein Powershellskript welches die Ordnerliste einliest, immer einen passenden Benutzer aus dem Active Directory sucht und die Rechte neu setzt.
Der Benutzer hat hinterher Vollzugriff und ist Besitzer von allen.
Das Skript muss auf einem System ausgeführt werden auf dem die PowerShell-Erweiterungen für das Active Directory installiert sind,
das setzen der Rechte funktioniert auch per UNC Pfad.
Ihr müsst TESTDOMAIN überall anpassen und ggf. die Auswahl der Benutzer und Gruppen welche hinzugefügt werden.

# Alle Verzeichnisse im Pfad abarbeiten, die AD-Gruppen dazu suchen und die Berechtigungen setzen
$s_CurrentPath = "\\FILESERVER\D$\Userhome\"
cls
$i_Counter = 0
# Liste der Ordnernamen holen
$a_ListFolders = Get-ChildItem -Path $s_CurrentPath -Directory -Force -ErrorAction SilentlyContinue | Select-Object Name,FullName
foreach($s_folder in $a_ListFolders) {
    $i_Counter = $i_Counter + 1
    if ( (-not ($s_folder.Name -like "*System Volume Information*")) -and (-not ($s_folder.Name -like "*RECYCLE.BIN*")) -and (-not ($s_folder.Name -like "*DfsRoot*")) ) {
        $s_GroupSearch1 = $s_folder.Name
        $s_GroupSearch2 = "Laufwerk-" + $s_folder.Name + "-[A-Z]-*"
        Write-Host "-----------------------------------------------------------------------------------------------------"
        Write-Host "Benutzerordner für" $s_folder.FullName
        # Rechte des Ordners holen
        $o_acl = Get-Acl -Path $s_folder.FullName
        # Vererbung deaktivieren
        $o_acl.SetAccessRuleProtection($true, $false)
        # vorhandene Rechte entfernen
        #Write-Host $o_acl.Access
        $o_acl.Access | ForEach-Object { $o_acl.RemoveAccessRule($_) | Out-Null }
        #$o_acl.Access | ForEach-Object { $o_acl.RemoveAccessRule($_) | Out-Null }
        # Administratoren hinzufügen
        $o_ace1 = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("VORDEFINIERT\Administratoren", "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
        $o_acl.AddAccessRule($o_ace1)
        $o_ace2 = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("TESTDOMAIN\" + "Domänen-Admins"), "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
        $o_acl.AddAccessRule($o_ace2)
        $o_ace3 = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("SYSTEM", "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
        $o_acl.AddAccessRule($o_ace3)
        $o_ace4 = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("ERSTELLER-BESITZER", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow")
        $o_acl.AddAccessRule($o_ace4)
        $o_ace5 = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("TESTDOMAIN\" + "Administrator"), "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
        $o_acl.AddAccessRule($o_ace5)
        $o_ace6 = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("TESTDOMAIN\" + "TESTDOMAIN_Global_Admins"), "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
        $o_acl.AddAccessRule($o_ace6)
        # Benutzer hinzufügen deren Name zum Ordner passt
        # $a_ListDriveGroups = Get-ADGroup -Filter 'Name -like $s_GroupSearch1' | Where-Object Name -like $s_GroupSearch2 | Select-Object Name
        $a_ListDriveGroups = Get-ADUser $s_GroupSearch1 | Select-Object Name
        if ( $a_ListDriveGroups -eq $null ) {
            Write-Host $s_folder.Name + " wurde nicht gefunden im Active Directory"
        } else {
            foreach($DriveGroup in $a_ListDriveGroups) {
                Write-Host $DriveGroup.Name
                $o_aceDriveGroup = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("ALEYMANN\" + $s_GroupSearch1), "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
                $o_acl.AddAccessRule($o_aceDriveGroup)
                # und zum Besitzer machen (klappt aber nur beim Hauptordner)
                $o_acl.SetOwner([System.Security.Principal.NTAccount] $s_GroupSearch1)
            }
        }
    
        # Ändert Besitzer für alle Dateien und Unterordner (aber nicht dem Stammordner)
        $myName = $s_folder.Name
        icacls $s_folder.FullName /setowner "TESTDOMAIN\$myName" /t
        Set-Acl -Path $s_folder.FullName -AclObject $o_acl
        $o_acl = ""
    }
    # zum Testen nur eine bestimmte Anzahl von Benutzern = Durchläufe durchführen
    if ( $i_Counter -eq 15 ) {
        # Nächste Zeile auskommentieren um nach 15 Benutzern zu stoppen
        #break
    }
}

Kommentare

Loading comments...