从共享信息中获取信息以在新域中创建文件夹

Get Information from Shares with Information to create the folders in a new Domain

所以我正在帮助将数据迁移到购买第一个数据的另一家公司,为此我必须在 .csv 文件中导出文件夹名、用户名和权限。 我有一个工作的 Skript,但它似乎花费了很长时间。它与一些没有太多文件夹的共享一起工作,但现在我已经 运行 进入脚本 运行 宁多个小时(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

我是不是错过了一件简单的事情,为什么它花了这么长时间,还是我完全搞砸了? 我就是没找到。

非常感谢任何帮助 提前致谢

迈克尔

如评论所述,通过使用 += 添加新项目来构建 $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