
3063370895
15.02.2023, aktualisiert um 13:15:53 Uhr
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:
Seht ihr daran irgendein Problem? Schlechte Herangehensweise? Übersehe ich etwas?
Backups sind natürlich vorhanden.
Dank und Gruß
chaot1coz
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?
Backups sind natürlich vorhanden.
Dank und Gruß
chaot1coz
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5990458117
Url: https://administrator.de/forum/massenbearbeitung-acl-windows-smb-shares-5990458117.html
Ausgedruckt am: 22.04.2025 um 18:04 Uhr
10 Kommentare
Neuester Kommentar
Servus @chaot1coz,
meinen Senf dazu
Das ganze mal so zusammengeschrieben.
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
*
Grüße Uwe
meinen Senf dazu
- 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
}
}
*Senf ende
Grüße Uwe