Windows NTFS - Fügen Sie jeder expliziten ACL in allen Unterordnern die Berechtigung hinzu

476
Blafasel

Wir haben eine Ordnerstruktur mit vielen expliziten Rechten wie

root Folder - subfolder 1 (explicit acl, no inherit acl) - subfolder 2 (explicit acl, no inherit acl) --subsubfolder 1 (no explicit rights, inherit acl) --subsubfolder 2 (explicit acl, no inherit acl) 

und so weiter

Ich möchte allen expliziten ACLs eine Berechtigung (Systemkonto) hinzufügen, nicht aber denen, die nicht explizit sind. Und natürlich gibt es einige Ordner, auf die auch von einem Administratorkonto aus nicht zugegriffen werden kann. Daher muss ich Fehler ignorieren.

Wer kennt ein Skript, das dies erreichen kann?

Edit1
Dank Hardoman ist hier eine funktionierende Lösung für aktuelle Ordner, Unterordner und Dateien und ohne den Fehler zu fangen ...

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname foreach ($item in $folders) { $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited if ($inheritance -eq $false) { icacls.exe $item /grant 'System:(OI)(CI)(RX)' } } 

Ich habe keine Lösung mit set-acl gefunden, vielleicht hat jemand eine Idee. Dies ist mein aktueller Set-acl-Status, aber der Unterordner erhält keine Berechtigungen, selbst wenn er vererbt wird.

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname foreach ($item in $folders) { $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited if ($inheritance -eq $false) { try { $acl = Get-Acl $item $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl, Synchronize", "ContainerInherit,ObjectInherit", "None", "Allow") $acl.SetAccessRule($AccessRule) Set-Acl $item $acl } catch { "Failed to access folder $item" "Exception type is $($_.Exception.GetType().Name)" } } } 
0
Verwenden Sie das Tool "icacls" und fügen Sie Ihre bevorzugten Berechtigungen hinzu. Weitere Informationen finden Sie hier: https://ss64.com/nt/icacls.html Biswapriyo vor 6 Jahren 0

1 Antwort auf die Frage

0
Hardoman

Dafür müssen Sie ein Powershell-Skript schreiben. Sie müssen rekursiv alle Ordner und Unterordner abrufen, die Vererbung überprüfen und mithilfe von Get-ACL und Set-ACL- Commadlets Berechtigungen für das Systemkonto hinzufügen . Try / catch behandelt die Fehler, falls das Skript nicht auf den Ordner zugreifen kann.

Hier ist das Beispiel, das ich für Sie geschrieben habe, unter der Annahme, dass Sie als Beispiel im Ordner C: \ temp reurse.

$folders = (Get-ChildItem c:\temp -Directory -Recurse) | select -ExpandProperty fullname foreach ($item in $folders) { $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited if ($inheritance -eq $false) { try { $acl = Get-Acl $item $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ("System","FullControl","Allow") $acl.SetAccessRule($AccessRule) $acl | Set-Acl $item } catch { "Failed to access folder $item" "Exception type is $($_.Exception.GetType().Name)" } } } 

PS Damit Get-ChildItem mit -Directory funktioniert, benötigen Sie Powershell 4+. Dieser Schalter fehlt in PS 2.0

Vielen Dank für dieses Problem, habe das Problem, dass jetzt System auf den korrekten Ordner eingestellt ist und wenn ich "ContainerInherit, ObjectInherit" zur Zugriffsregel hinzufüge, die Berechtigung auf den Ordner lautet, der die Berechtigung festgelegt hat ... Alle Unterordner / Dateien erhalten jedoch keine Berechtigung, auch wenn sie vererbt werden. Irgendwelche Ideen dazu? Mit set-acl wurden zahlreiche Themen zu diesem Thema gefunden, jedoch keine echte Lösung, außer dass icacls.exe anstelle von set-acl verwendet wurde Blafasel vor 6 Jahren 0