Удалить списки управления доступом для определенной группы в больших папках - PullRequest
0 голосов
/ 28 октября 2019

Мне нужно удалить определенную запись 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 занимает

...