Windows NTFS - Adicionar permissão a cada ACL explícita em todas as subpastas

0

Temos uma estrutura de pastas com muitos direitos explícitos, como

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)

e assim por diante

Eu quero adicionar uma permissão (Conta do Sistema) a todas as ACLs explícitas, mas não àquelas que não são explícitas. E, claro, existem algumas pastas que não são acessíveis nem mesmo por uma conta de administrador, por isso preciso ignorar erros.

Alguém ciente de um script que pode conseguir isso?

Editar1
Graças a Hardoman, aqui está uma solução de trabalho para a pasta atual, subpasta e arquivos e sem pegar o erro ...

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

Não encontrei uma solução com set-acl, talvez alguém tenha uma ideia, este é meu estado atual de set-acl, mas a subpasta não obtém as permissões mesmo quando são herdadas.

$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)"
        }
    }
}
    
por Blafasel 24.08.2018 / 10:20

1 resposta

0

Você precisa escrever um roteiro Powershell para isso. Você precisa recursivamente obter todas as pastas e subpastas, verificar a herança de cada uma e usar Get-ACL e Set-ACL commadlets adicionar permissões para o sistema conta. Try / catch irá lidar com os erros no script caso não consiga acessar a pasta.

Aqui está a amostra que escrevi para você, presumindo que você recurse na pasta C: \ temp como exemplo.

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

P.S. Para Get-ChildItem com -Directory funcionar, você precisa ter o Powershell 4+. Esta opção está faltando no PS 2.0

    
por 26.08.2018 / 15:47