3063370895
Goto Top

Massenbearbeitung ACL Windows SMB Shares

Hallo zusammen,

Ich brauche einen kurzen Sanity-Check:

Ich habe einen Windows Server mit SMB-Shares. In diesen Shares liegen ~2 Mio Dateien. Die Berechtigungen und Vererbungen sind bunt gemischt. Die Shares liegen alle als Unterordner auf Laufwerk D:

Nun möchte ich sämtlichen Dateien und Ordnern in allen Netzwerkshares dieses Servers einer AD-Gruppe Vollzugriff gewähren, ohne die anderen Berechtigungen oder Vererbungseinstellungen zu verändern.

Dazu habe ich dieses Skript geschrieben:

$identity = 'domäne\gruppe'  
$rights = 'FullControl'  
$inheritance = 'ContainerInherit, ObjectInherit'  
$propagation = 'None'  
$type = 'Allow'  
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity, $rights, $inheritance, $propagation, $type)

Get-ChildItem D: -Recurse -Directory | ForEach-Object{
    $acl = get-acl -Path $_.FullName
    $acl.AddAccessRule($ACE)
    Set-Acl -Path $_.FullName -AclObject $acl 
 }

Seht ihr daran irgendein Problem? Schlechte Herangehensweise? Übersehe ich etwas? face-smile

Backups sind natürlich vorhanden.

Dank und Gruß
chaot1coz

Content-Key: 5990458117

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

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 3063370895
3063370895 Feb 15, 2023 at 14:16:27 (UTC)
Goto Top
Noch ein bisschen Recherche hat mir ergeben, dass ich hier mit icacls wohl besser dran bin:

icacls D:\ /grant domäne/gruppe:(OI)(CI)F /T

Seht ihr das genau so?
Member: colinardo
Solution colinardo Feb 15, 2023, updated at Feb 16, 2023 at 05:48:14 (UTC)
Goto Top
Servus @chaot1coz,
meinen Senf dazu face-wink
  • Das Skript wird an Ordnern und dessen Unterordner scheitern die nicht im Besitz von Dir oder einer Gruppe dessen du Mitglied bist, sind. Damit das nicht passiert kann man sich das Backup-Privilege-Token holen, damit kann man auch ohne Besitzübernahme des Ordners dessen Rechte anpassen (macht Robocopy bspw. auch so wenn man den Parameter /B verwendet).
  • Du fügst jedem Ordner einen Berechtigungseintrag hinzu nicht nur bei denen die Vererbung unterbrochen ist, das kann man zwar machen, aber das bläht erstens bei vielen Ordnern die ACL massiv auf, zweitens macht es Zugriffe langsamer, und drittens macht es das Aufräumen hinterher etwas aufwendiger/langsamer. Ich würde hier also die Berechtigungseinträge nur bei Ordnern hinzufügen bei denen die Vererbung unterbrochen wurde.
  • Der Geschwindigkeit zu liebe würde ich hier auch nicht das ForEach-Object benutzen sondern eine Foreach-Schleife, das sind aber nur Details die nichts an der Funktion ändern.

Das ganze mal so zusammengeschrieben.
# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# assign Backup/Restore/TakeOwnership Token to current process
Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

# startfolder
$startfolder = 'D:'  
# account
$account = 'DOMAIN\GruppeABC'  
# ace
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule $account,"FullControl","ContainerInherit,ObjectInherit","None","Allow"  

# apply rule to startfolder
$acl = Get-ACL $startfolder
$acl.AddAccessRule($rule)
Set-ACL -LiteralPath $startfolder -AclObject $acl

# apply rule to each "protected" child folder 
Foreach($folder in Get-ChildItem -LiteralPath $startfolder -Directory -Recurse -Force){
    $acl = Get-ACL -LiteralPath $folder.Fullname
    if ($acl.AreAccessRulesProtected){
        $acl.AddAccessRule($rule)
        Set-ACL -LiteralPath $folder.Fullname -AclObject $acl
    }
}
Wenn man wollte könnte man das ganze jetzt noch mit Multi-Threading beschleunigen, etc. pp aber das lass ich erst mal um das ganze hier jetzt nicht noch weiter aufzublähen.

*Senf ende face-smile*

Grüße Uwe
Mitglied: 3063370895
3063370895 Feb 15, 2023 at 14:34:20 (UTC)
Goto Top
Hi @colinardo,

sehr gute Hinweise mit dem Backup-Token und dass man nur die Ordner anpackt, bei denen die Vererbung deaktiviert ist, danke dafür!

Ich schätze icacls /T ist damit auch raus, weil das auch auf jeden Ordner schreiben würde.
Member: colinardo
colinardo Feb 15, 2023 at 14:38:09 (UTC)
Goto Top
Zitat von @chaot1coz:
Ich schätze icacls /T ist damit auch raus, weil das auch auf jeden Ordner schreiben würde.
Ja.
Member: colinardo
colinardo Feb 15, 2023 updated at 14:42:09 (UTC)
Goto Top
Beachten solltest du auch evt. vorhandene Verweigerungs-Einträge. Sollte in einem Verzeichnis für den im Skript angegebenen User/Gruppe eine Verweigerung existieren, musst du diese natürlich entfernen damit deine Berechtigung davon nicht übersteuert wird.
Mitglied: 3063370895
3063370895 Feb 15, 2023 updated at 14:43:45 (UTC)
Goto Top
Verweigerungen gibt es nicht, da die Gruppe neu erstellt wurde, danke für den Hinweis!

Ich habe das jetzt mal mit einem Unterordner getestet, das Problem was ich jetzt habe ist noch dass die Dateien in den Ordnern nicht mit angepasst werden. Ich dachte, die Dateien übernehmen automatisch die Rechte des Ordners - falsch gedacht face-smile

Ich denke ich muss das -Directory entfernen und dann noch prüfen ob es sich um eine Datei oder Ordner handelt und dann entsprechend die AccesRule vorbereiten und anwenden.
Member: colinardo
colinardo Feb 15, 2023 updated at 14:46:18 (UTC)
Goto Top
Wenn du natürlich unterbrochene Berechtigungsanpassungen auf Dateiebene hast dann weitest du es halt zusätzlich auf Dateien aus indem du das -Directory weglässt.
Mitglied: 3063370895
3063370895 Feb 15, 2023 updated at 14:47:09 (UTC)
Goto Top
Klappt leider nicht direkt, da ich Dateien keine AccessRule mit aktivierter Vererbung geben kann.

Ausnahme beim Aufrufen von "AddAccessRule" mit 1 Argument(en):  "Es können keine Flags gesetzt werden.  
Parametername: inheritanceFlags"  

Also entweder zwei mal Get-ChildItem, einmal -File und einmal -Directory oder eben alles auf einmal und abfragen ob es eine Datei oder Ordner ist
Member: colinardo
colinardo Feb 15, 2023 updated at 14:48:58 (UTC)
Goto Top
Aber Dateien musst du eigentlich nicht anpassen da durch die Rechte des Oberordners die Rechte eh schon da sind egal was in der ACL der Dateien steht.
Mitglied: 3063370895
3063370895 Feb 15, 2023 at 14:51:50 (UTC)
Goto Top
Ja hatte ich auch gedacht und ist natürlich auch so. Ich war irritiert weil die Gruppe nach dem Test in den Sicherheitsoptionen der Datei nicht angezeigt wurde, es funktioniert aber trotzdem.
Stand da irgendwie auf der Leitung - langer Tag!

Danke nochmal face-smile