Получить информацию из общих ресурсов с информацией для создания папок в новом домене - PullRequest
0 голосов
/ 29 марта 2020

, поэтому я помогаю с переносом данных в другую компанию, которая купила первую, для которой мне нужно экспортировать Foldernames, User-Names и Permissions в файл .csv. У меня есть рабочий скрипт, но, похоже, он занимает очень много времени. Он работал с несколькими общими папками, в которых не было слишком много папок, но теперь я столкнулся со сценариями, работающими в течение нескольких часов (более 100 000 папок). Из меньших акций, которые я знаю, это дает мне правильную информацию, но это занимает много времени для количества оставшихся акций.

$FolderPath = dir -Directory -LiteralPath "\\?\UNC\Server\Share" -Recurse -Force
$Report = @()
Foreach ($Folder in $FolderPath) {
    $Acl = Get-Acl -Path $Folder.FullName
    foreach ($Access in $acl.Access){
            $Properties = [ordered]@{
                'FolderName'=$Folder.FullName
                'AD Group or User'=$Access.IdentityReference
                'Permissions'=$Access.FileSystemRights
                'Inherited'=$Access.IsInherited
            }
            $Report += New-Object -TypeName PSObject -Property $Properties
   }
}
$Report | Export-Csv -path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8

Я упускаю простую вещь, почему это занимает так много времени, или я просто испортил полностью? Кажется, я просто не могу его найти.

Любая помощь будет очень признательна. Спасибо заранее

Майкл

1 Ответ

0 голосов
/ 30 марта 2020

Как уже отмечалось, создание массива $Report путем добавления к нему новых элементов с помощью += - это очень затратный по времени и памяти способ.

Позволить PowerShell выполнять сбор, как показано ниже.

Кроме того, Get-ChildItem (псевдоним dir) может быть медленным, особенно при работе со многими подпапками, поэтому использование RoboCopy может быть более быстрой альтернативой этому.

# get the list of directory full path names
# Get-ChildItem can be slow, so maybe try Robocopy as alternative
# $Folders = (Get-ChildItem -Directory -LiteralPath "\\?\UNC\Server\Share" -Recurse -Force).FullName

$Folders = (robocopy "\\Server\Share" NULL /L /E /NP /NFL /XJ /NC /NJH /NJS /R:0 /W:0) -replace '^\s*\d*\s*'
$Report  = foreach ($Folder in $Folders) {
    $Acl = Get-Acl -Path $Folder
    foreach ($Access in $Acl.Access){
        [PsCustomObject]@{
            'FolderName'       = $Folder
            'AD Group or User' = $Access.IdentityReference
            'Permissions'      = $Access.FileSystemRights.ToString()
            'Inherited'        = $Access.IsInherited
        }
   }
}
$Report | Export-Csv -Path "C:\Filepath\export.csv" -Delimiter ";" -Encoding UTF8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...