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

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)"
        }
    }
}

1 ответ1

0

Для этого вам нужно написать скрипт 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .