Você pode fazer isso assim (dividi-lo em mais instruções ajuda na legibilidade):
# Go to the directory and find the files
Push-Location "C:\MDMarrasFiles"
$Files = Get-ChildItem -Recurse
# Create an IdentityReference and a FullControl FileSystemAccessRule for said identity
$Principal = New-Object System.Security.Principal.NTAccount("DOMAIN\user")
$FullControlACERule = New-Object System.Security.AccessControl.FileSystemAccessRule -ArgumentList ($Principal,"FullControl","Allow")
# Go through the files
foreach($File in $Files)
{
# Get the current ACL on the file
$ACL = Get-ACL $File
# Extract the ACEs, both explicit on the file and inherited
$ACEs = $ACL.GetAccessRules($true,$true,[System.Security.Principal.NTAccount])
# Filter the ACEs to extract those giving FullControl to your target user
$ACEsMatching = $ACEs |Where {'
$_.FileSystemRights -eq "FullControl" -and '
$_.IdentityReference -eq $objUser -and '
$_.AccessControlType -eq "Allow"'
}
# Test if there where no such ACE to be found
if($ACEsMatching.Count -eq 0)
{
# Add the FullControl Rule to the current ACL
$ACL.AddAccessRule($FullControlACERule)
# Write the new ACL back to the file
Set-ACL $File -AclObject $ACL
}
}
Pop-Location
Por favor, teste isso em um subconjunto menor de arquivos antes de rodar em produção; -)
Se você quiser ter certeza de que uma nova ACE explícita seja adicionada, mesmo que a conta já tenha herdado o direito, filtre as Regras de acesso herdadas como esta:
$ACEs = $ACL.GetAccessRules($true, $false ,[System.Security.Principal.NTAccount])
Observe como o segundo argumento booleano agora é $false
, indicando que as regras herdadas não devem ser retornadas