3063370895
Feb 15, 2023, updated at 12:15:53 (UTC)
1628
10
0
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 5990458117
Url: https://administrator.de/contentid/5990458117
Printed on: April 19, 2024 at 22:04 o'clock
10 Comments
Latest comment
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