Мне нужно удалить определенную запись ACL (группу) для некоторых папок большого размера, заполненных файлами (приблизительно 250 ТБ). Наследование - беспорядок, поэтому их лучше удалять по папкам (и подпапкам) и по элементам.
Я использую модуль NTFSSecurity на https://github.com/raandree/NTFSSecurity, чтобы повозиться с Acls.
У меня есть функциональная функция, но проблема в том, что для удаления ошибочного Acl требуется (измерено) 16,5 секунд на гигабайт. Это означает, что для удаления всех Acls может потребоваться несколько дней, и многие пользователи и приложения часто обращаются к этой папке, поэтому время простоя составляет не более 48 часов (выходные).
Function Remove-ACl {
Param
(
[Parameter(Mandatory = $true, Position = 0)][Alias("S")]$SourceFolder,
[Parameter(Mandatory = $true, Position = 1)][Alias("O")]$AclObject,
[Parameter(Mandatory = $False, Position = 2)][Alias("L")]$LogsFolder=$env:TEMP
)
$LogDate = Get-Date -Format MMddyyyy.HHmmss
$FDListErrors = "$LogsFolder\FolderErrors.$LogDate.txt"
$FLListErrors = "$LogsFolder\FileErrors.$LogDate.txt"
$FDListOk = "$LogsFolder\FolderOk.$LogDate.txt"
$FLListOk = "$LogsFolder\FileOk.$LogDate.txt"
$Message = "Permissions for $AclObject removed on "
Try {$Folders = [System.IO.Directory]::EnumerateDirectories($SourceFolder, '*.*', 'AllDirectories')} catch {$_ | Out-File -FilePath $FDListErrors -Append -NoClobber}
Try {$Files = [System.IO.Directory]::EnumerateFiles($SourceFolder, '*.*', 'AllDirectories')} catch {$_ | Out-File -FilePath $FLListErrors -Append -NoClobber}
$SourceFolder | Get-NTFSAccess -Account $AclObject | Remove-NTFSAccess
Foreach ($Fd in $Folders)
{
Try {
Get-ChildItem -Force $Fd | Get-NTFSAccess -Account $AclObject | Remove-NTFSAccess
$Message+$Fd | Out-File -FilePath $FDListOk -Append -NoClobber
} catch {$_ | Out-File -FilePath $FDListErrors -Append -NoClobber}
}
Foreach ($Fl in $Files)
{
Try {
Get-ChildItem -Force $Fl | Get-NTFSAccess -Account $AclObject | Remove-NTFSAccess
$Message+$Fl | Out-File -FilePath $FLListOk -Append -NoClobber
} catch {$_ | Out-File -FilePath $FLListOk -Append -NoClobber}
}
}
IЯ хотел бы повысить скорость выполнения этой функции. Я уже довольно быстро перечисляю папки и файлы, вызывая методы [System.IO.Directory] :: EnumerateDirectories и [System.IO.Directory] :: EnumerateFiles, но обрабатываясамо удаление Acl занимает