Aktionen

PowerShell Ordnern Gruppen zuordnen und Rechte setzen

Aus znilwiki

Changelog:

  • 20.07.2023 erste Version
  • 21.07.2023 Ersteller/Besitzer entfernt - bei Netzlaufwerken war das eine schlechte Idee

Problem

Ich hatte um die 100 Ordner welche per Robocopy auf einen neuen Server kopiert wurden.
Ein Ordner heißt zum Beispiel Buchhaltung.

Buchhaltung

Es gibt dazu die Active-Directory-Gruppen

Laufwerk-Buchhaltung-R
Laufwerk-Buchhaltung-RW

für den Zugriff.
Gewünscht war

  • Die beiden Gruppen unter Sicherheit bei den Ordner hinterlegen
  • die -R Gruppe nur lesend
  • die -RW Gruppen lesend und schreibend
  • Rekursiv die Rechte neu setzen

Lösung

Das Skript arbeitet alle Verzeichnisse im vorgegebenen Ordner ab und sucht für jeden die passenden AD-Gruppen.
Dann werden die Rechte auf dem Ordner alle entfernt und neu gesetzt.
Das Skript muss auf einem System mit der installierten PowerShell-Erweiterung für Actice Directory ausgeführt werden.
Es sollte auch mit UNC-Pfaden funktionieren.

# Alle Verzeichnisse im Pfad abarbeiten, die AD-Gruppen dazu suchen und die Berechtigungen setzen
$s_CurrentPath = "D:\"

# 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) {
    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 = "Laufwerk-" + $s_folder.Name + "-*"
        $s_GroupSearch2 = "Laufwerk-" + $s_folder.Name + "-[A-Z]-*"
        Write-Host "---------------------------------------------------------------------------------------"
        Write-Host "$s_GroupSearch1 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
        $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)
        # Gruppen hinzufügen deren Namen zum Ordner passt
        $a_ListDriveGroups = Get-ADGroup -Filter 'Name -like $s_GroupSearch1' | Where-Object Name -like $s_GroupSearch2 | Select-Object Name
        if ( $a_ListDriveGroups -eq $null ) {
            Write-Host $s_folder.Name + " hat keine Gruppe(n) im Active Directory"
        } else {
            foreach($DriveGroup in $a_ListDriveGroups) {
                Write-Host $DriveGroup.Name
                $s_GroupType = $DriveGroup.Name.Substring($DriveGroup.Name.Length - 2)
                if ( $s_GroupType -eq "RW" ) {
                    $o_aceDriveGroup = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("TESTDOMAIN\" + $DriveGroup.Name), "FullControl", "ContainerInherit,ObjectInherit", "none", "Allow")
                } else {
                    $o_aceDriveGroup = New-Object System.Security.Accesscontrol.FileSystemAccessRule (("TESTDOMAIN\" + $DriveGroup.Name), "Read", "ContainerInherit,ObjectInherit", "none", "Allow")
                }
                $o_acl.AddAccessRule($o_aceDriveGroup)
            }
        }
        # Rechte schreiben
        Set-Acl -Path $s_folder.FullName -AclObject $o_acl
        $o_acl = ""
    }
}

Kommentare

Loading comments...