hamspirit
Goto Top

500 Ordner - NTFS Berechtigungen mit wenigen Klicks ändern

Hallo zusammen,

eine Fileserver-Migration steht an.
Der neue Fileserver bestitz 15 Ordner auf der ersten Ebene und darunter zwei weitere Ebenen, die den Datenbestand strukturieren.
In der dritten Ebene sollen nun unterschiedliche Berechtigungen zum Einsatz kommen. In Summe sind das knapp 500 Ordner, die in der dritten Ebene liegen.

Mir widerstrebt es jetzt in jedem Ordner die Rechtevererbung von Hand zu unterbrechen und danach die entsprechenden AD-Gruppen zu berechtigen.

Gibt es eine Möglichkeit, um diese Vererbung der NTFS-Rechte ohne viel Klickerei zu unterbrechen?
Die Gruppen den Rechten hinzuzufügen wäre ja noch ok. Aber diese elendige Klickerei zum Unterbrechen der Vererbung nervt ungemein.

Ich könnte mir vorstellen, die Ordner Strukturen in eine Textdatei zu packen und dann ein Skript darüber rennen zu lassen. Ich habe nur keine Ahnung, wie das dann aussehen muss, damit die Vererbung danach unterbrochen ist.

Besten Dank vorab!

Grüße
HamSpirit

Content-ID: 222598

Url: https://administrator.de/contentid/222598

Ausgedruckt am: 18.11.2024 um 23:11 Uhr

colinardo
colinardo 21.11.2013 aktualisiert um 10:43:30 Uhr
Goto Top
Hallo HamSpirit,
hatten wir hier schon mehrfach. Mit Powershell und den CMDLets get-acl und set-acl kein Problem.
Siehe dazu auch folgenden Beitrag: Powershell - Zugriffsberechtigungen von Ordnern übertragen
Ansonsten liefert eine Suche hier im Forum mit folgendem Suchstring die gewünschten Treffer :
"powershell acl"

Grüße Uwe
colinardo
colinardo 21.11.2013 aktualisiert um 11:12:57 Uhr
Goto Top
Um es dir etwas einfacher zu machen, hier ein Script das du dazu hernehmen könntest:
Du legst für einen Ordner im System die gewünschten Berechtigungen fest die du auf die anderen Ordner übertragen möchtest, und trägst den Pfad in Zeile 1 des Scripts ein. Diese Berechtigungen werden dann auf alle Unterordner für den Pfad den du in Zeile 2 angibst angewendet inklusive Unterbrechung der Vererbung.
$sourceACL = get-acl -Path "C:\Temp\source"  
$startFolder = "C:\Zielordner"  

#Vererbung des ACL-Objektes deaktivieren (Parameter 1) bestehende Berechtigungen erhalten (Parameter 2)
$sourceAcl.SetAccessRuleProtection($true,$true)

#Alle Unterordner (erste Ebene des Ordners)
$allSubFolders = dir $startFolder | ?{$_.PSIsContainer}

#Für alle Unterordner der ersten Ebene die ACLs durch das des $sourceACL-Objektes ersetzen
foreach($folder in $allSubFolders){
    Set-Acl -Path $folder.FullName -AclObject $sourceACL
}
Grüße Uwe
hamspirit
hamspirit 22.11.2013 um 07:36:50 Uhr
Goto Top
Danke für diese Hilfestellung, Uwe.
Die Vererbung habe ich für die besagten Ordner nun unterbrochen. Das erspart einem doch viele Stunden Klickerei. ;)

Wie komplex wird es, wenn ich zwei Textdateien nutzen will, um Berechtigungen zuzuweisen.
In Textdatei1 sollen zeilenweise Ordner stehen. Bsp: d:\freigabe\Ordner\bla\bla
In Textdatei2 sind passend dazu Gruppen aus dem AD aufgeführt werden.
Ziel soll es sein, dass die AD-Gruppe aus Zeile 1 aus Textdatei2 Berechtigungen auf den Ordner aus Zeile 1 aus Textdatei1 erhält.

Habe noch keine Möglichkeit gefunden, Informationen aus zwei Dateien zusammenfließen zu lassen. Oder kann man das auf andere Weise erledigen?

Nochmals vielen Dank und beste Grüße
HamSpirit
colinardo
colinardo 22.11.2013 aktualisiert um 09:45:38 Uhr
Goto Top
Hallo Hamspirit,
ich würde das ganze in eine einzelne CSV-Datei packen die dann so aussehen könnte:
"FREIGABE";"BERECHTIGUNGEN"
"d:\freigabe\Ordner\bla\bla";"DOMAIN\Group1,DOMAIN\Group2,DOMAIN\Group3"
also in der ersten Spalte der Ordner, und in der zweiten Spalte mit Komma voneinander getrennt die Gruppen. So hat man alles zusammen in einer Datei und muss nicht immer hin und her springen... Deine Variante ist auch kein Problem, aber ich sehe keinen Grund das zu trennen.

Wenn du willst bau ich dir dazu das entsprechende Script.

Was auch noch benötigt wird sind dann die entsprechenden Zugriffsrechte (R/W,Vollzugriff, etc)

Grüße Uwe
colinardo
colinardo 22.11.2013 um 10:27:45 Uhr
Goto Top
Zu meinem Beispiel mit der CSV-Datei kannst du folgendes Script hernehmen:
#CSV-Datei
$csvPermissions = import-csv "C:\Temp\permissions.txt" -Delimiter ";"  

foreach($line in $csvPermissions){
    #Freigabeordner
    $folder = $line.Freigabe
    #Berechtigungen
    $groups = $line.Berechtigungen.Split(",")  
    #Wenn Ordner existier
    if ((Test-Path $folder)){
        #Wenn überhaupt Berechtigungen angegeben sind
        if ($groups.length -gt 0){
            #Neues leeres ACL-Objekt erzeugen
            $newACL = New-Object System.Security.AccessControl.DirectorySecurity
            #Vererbung der ACL deaktivieren
            $newACL.SetAccessRuleProtection($true,$false)
            #Für jede Gruppe die entsprechende AccessRule zur ACL hinzufügen
            for ($i = 0 ; $i -lt $groups.length; $i++){
                #Gebe der Gruppe "Vollzugriff" und vererbe diese Rechte an Unterordner und Objekte 
                $perm = $groups[$i],"FullControl","ContainerInherit,ObjectInherit","None","Allow"  
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule $perm
                $newACL.AddAccessRule($objACE) 
            }
            # Schreibe die ACL
            set-acl -Path $folder -AclObject $newACL
        }
    }else{
        #Ordner wurde nicht gefunden
        echo "Der Ordner '$folder' existiert nicht unterhalb von '$startFolder'!"  
    }
    
}
Die Formatierung der CSV-Datei sollte wie oben geschrieben so aussehen (inklusive der Überschriften):
"Freigabe";"Berechtigungen" 
"d:\freigabe\Ordner\bla\bla";"DOMAIN\Group1,DOMAIN\Group2,DOMAIN\Group3"

Bin jetzt erst mal hier im Beispiel von "Vollzugriff" Rechten für die Gruppen ausgegangen, das lässt sich aber anpassen ...

Grüße Uwe
hamspirit
hamspirit 26.11.2013 um 10:21:54 Uhr
Goto Top
Uwe, vielen Dank.

Das Unterbrechen der Vererbung habe ich nun mit diesem Script erledigt:

for /f "tokens=*" %%a in (e:\folderlist2.txt) do (  
  icacls %%a /inheritance:d
)


Für die Vergabe von Berechtigungen auf die verschiedenen Ordner kam dieses Powershell-Script zum Einsatz:

$Path = @()
$Group = @()


$Permissions = Import-Csv E:\permissions.csv -delimiter '|'  

    ForEach ($line in $Permissions)

             {
        write-host $line
        $acl = Get-Acl $line.Path
        $acl.SetAccessRuleProtection($True, $False)
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($line.Group,"ReadAndExecute", "ContainerInherit, ObjectInherit", "None", "Allow")  
        $acl.AddAccessRule($rule)
        Set-Acl $line.Path $acl
       		}

Die Permissions.csv bestand aus:

Path|Group
E:\Ordner1\Ordner2\|Meine_AD_Gruppe