Em vários servidores onde trabalho, as permissões de pasta de compartilhamento ficaram confusas com permissões diretas para alguns de nossos técnicos devido à necessidade deles de assumir a propriedade. Eu descobri como corrigir o problema de propriedade para que isso não aconteça mais, mas estou preso na limpeza dessas permissões. infelizmente quando executo este comando nada acontece, nem mesmo um erro. Suponho que seja algum tipo de erro lógico da minha parte, mas não consigo identificá-lo. Qualquer ajuda seria apreciada.
# $vData is the root path
Get-Item $vData | foreach { $_ ; $_ | Get-ChildItem -directory -Force -Recurse }| foreach { $currentDir = $_; $acl = ($_ | Get-Acl).Access; $IDs = $acl | select identityreference ; foreach ($ID in $IDs) { if (($ID.ToString()).endswith('-admin')) { $acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID }; $acl.RemoveAccessRuleAll($acesToRemove); Set-Acl -AclObject $acl $currentDir.ToString(); } } }
como é um forro de 1 linha, dividi-o abaixo para facilitar a leitura.
Get-Item $vData |`
foreach {`
$_ ; $_ | Get-ChildItem -directory -Force -Recurse `
}`
| foreach {`
$currentDir = $_;`
$acl = ($_ | Get-Acl).Access; `
$IDs = $acl | select identityreference ;`
foreach ($ID in $IDs) { `
if (($ID.ToString()).endswith('-admin')) {`
$acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };`
$acl.RemoveAccessRuleAll($acesToRemove); `
Set-Acl -AclObject $acl $currentDir.ToString(); `
}`
}`
}
o código para remover as permissões é baseado no código que encontrei aqui Remova completamente um usuário da ACL usando o PowerShell
Responder1
Acredito que RemoveAccessRuleAll (e RemoveAccessRule) funcionam na ACL, não na propriedade Access. Em vez disso, tente algo assim:
Get-ChidItem -Path $root -Directory -Force -Recurse |
ForEach-Object -Process {
$path = $_.FullName
Write-Output "Working on '$path'"
$acl = Get-Acl -Path $path
if ($aclsToRemove = $acl.Access | Where-Object -FilterScript { $_.IdentityReference -like '*-admin' }) {
Write-Output " Found $($aclsToRemove.Count) ACLs to remove:"
foreach ($aclToRemove in $aclsToRemove) {
Write-Output " Removing $($aclToRemove.IdentityReference) - $($aclToRemove.FileSystemRights) - $($aclToRemove.AccessControlType) from ACL list"
$acl.RemoveAccessRule($aclToRemove)
}
Write-Output " Setting new ACL on filesystem"
Set-Acl -Path $_.FullName -AclObject $acl
}
}
Responder2
Encontrei a resposta abaixo no reddit e parece realizar o que eu precisava.
dehttps://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/ PS_Alex
Acho que seu problema aqui é $acl = ($_ | Get-Acl).Access. Seu objeto $acl contém apenas o ACE. O cmdlet Set-Acl espera o objeto ACL completo como uma entrada para o argumento -AclObject.
Você poderia tentar isso:
#Assuming $vdata is your root path
foreach ($pasta em Get-ChildItem -Path $vdata -Directory -Recurse -Force) {
#Get the current ACL of the folder
$acl = Get-Acl -Path $folder.FullName
#Uncomment to explore the $acl object
#$acl | fl
#Filter the ACEs to identify the ones to remove, and remove them
foreach ($aceToRemove in $acl.Access.Where({$psitem.IdentityReference -match "-admin$" -and $psitem.IsInherited -eq $false})) {
$acl.RemoveAccessRule($aceToRemove)
}
#Uncomment to explore the $acl object
#$acl | fl
#Apply the ACL
Set-Acl -AclObject $acl -Path $folder.FullName
}