Que tal agarrar manualmente apenas o primeiro nível e, em seguida, repetir o segundo nível como um passo? Fiz o seu código para imprimir as ACLs em uma função e passei manualmente pelos três primeiros níveis. Se os itens no primeiro nível forem pastas ( $_.ISPSContainer
), eles obterão seus itens filhos extraídos e processados e outro nível dos mesmos para obter o próximo nível. Idealmente, você não iria reutilizar o código, ele deveria ser refatorado em outra função para fazer a recursão, mas isso exigiria a passagem de um parâmetro que você poderia dizer quantos níveis mais para puxar. Então, cada loop poderia diminuir esse contador e chamar a si mesmo se o $counter -gt 0
.
Function Print-Acl {
param(
[Parameter(
Position=0,
Mandatory=$true)
]
[String[]]$Path
)
$Acl = Get-Acl $Path
$Acl |
Select-Object -ExpandProperty Access |
Add-Member -MemberType NoteProperty -Name Path -Value $Path -PassThru |
Add-Member -MemberType NoteProperty -Name Owner -Value $Acl.Owner -PassThru
}
Get-ChildItem -path $share | ForEach-Object {
# First Level
if ($_.PSIsContainer) {
Print-Acl -Path $_.FullName
Get-ChildItem -Path $_.FullName | ForEach-Object {
# Second Level
if ($_.PSIsContainer) {
# Third level
Print-Acl -Path $_.FullName
Get-ChildItem -Path $_.FullName | ForEach-Object {
Print-Acl -Path $_.FullName
}
}
else {
Print-Acl -Path $_.FullName
}
}
}
else {
Print-Acl -Path $_
}
}