Windows NTFS - добавьте разрешение для каждого явного ACL во всех подпапках

335
Blafasel

У нас есть структура папок со многими явными правами, такими как

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) 

и так далее

Я хочу добавить разрешение (Системная учетная запись) для всех явных ACL, но не для тех, которые не являются явными. И, конечно, есть некоторые папки, которые недоступны даже учетной записи администратора, поэтому мне нужно игнорировать ошибки.

Кто-нибудь знает сценарий, который может достичь этого?

Edit1
Благодаря Hardoman, вот рабочее решение для текущей папки, подпапки и файлов и без перехвата ошибки ...

$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)' } } 

Не нашел решения с помощью set-acl, возможно, у кого-то есть идея, это мое текущее состояние set-acl, но подпапка не получает разрешения, даже когда они наследуются.

$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
Используйте инструмент `icacls` и добавьте предпочитаемые разрешения. Подробнее здесь: https://ss64.com/nt/icacls.html Biswapriyo 6 лет назад 0

1 ответ на вопрос

0
Hardoman

Для этого вам нужно написать скрипт Powershell. Вам необходимо рекурсивно получить все папки и подпапки, проверить наследование для каждой и с помощью командлетов Get-ACL и Set-ACL добавить разрешения для системной учетной записи. Try / catch обработает ошибки в случае, если скрипт не сможет получить доступ к папке.

Вот пример, который я написал для вас, предполагая, что вы используете его в папке C: \ temp в качестве примера.

$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 Для работы Get-ChildItem с -Directory вам необходимо иметь Powershell 4+. Этот переключатель отсутствует в PS 2.0

Спасибо за это, проблема в том, что теперь система настроена на правильную папку (и), и когда я добавляю «ContainerInherit, ObjectInherit» к правилу доступа, разрешение находится прямо на папке, которая установила разрешение ... но все подпапки / файлы не получают разрешения, даже если они наследуются. Есть идеи по этому поводу? Обнаружено множество тем по этому вопросу с помощью set-acl, но нет реального решения, кроме использования icacls.exe вместо set-acl Blafasel 6 лет назад 0