Multithreading 在DC&x27中加速;s扫描

Multithreading 在DC&x27中加速;s扫描,multithreading,performance,powershell,attributes,Multithreading,Performance,Powershell,Attributes,我正在构建一个脚本,它将进入每个DC,从modifytimestame值中获取值,然后将最大值作为以下代码,此时代码速度太慢,因为现在它进入每个域并将值放入数组,然后从数组中获取最大值。我想加快速度。我曾考虑使用多线程,但仍在寻找更好的实现方法 $Searcher = New-Object System.DirectoryServices.DirectorySearcher $Searcher.PageSize = 100 $Searcher.SearchScope = "subtree"

我正在构建一个脚本,它将进入每个DC,从
modifytimestame
值中获取值,然后将最大值作为以下代码,此时代码速度太慢,因为现在它进入每个域并将值放入数组,然后从数组中获取最大值。我想加快速度。我曾考虑使用多线程,但仍在寻找更好的实现方法

$Searcher = New-Object System.DirectoryServices.DirectorySearcher 
$Searcher.PageSize = 100 
$Searcher.SearchScope = "subtree" 
$Searcher.Filter = "(&(objectCategory=$objectCategory)(objectClass=$objectClass))"
$Searcher.PropertiesToLoad.Add("distinguishedName")|Out-Null
$Searcher.PropertiesToLoad.Add("modifyTimeStamp")|Out-Null

Function modiScan{

    forEach ($users In $userObjects) 
    { 

            $DN = $users.Properties.Item("distinguishedName")[0]
            $dnarr.add($DN)|Out-Null
    }
    #$dnarr
    foreach($dnn in $dnarr){
        $error = $false
        $lastmd = New-Object System.Collections.ArrayList
        ForEach ($DC In $Domain.DomainControllers){                    
            $Server = $DC.Name
            $Base = "LDAP://$Server/"+$dnn
            $Searcher.SearchRoot = $Base                    
            try{
                $Results2 = $Searcher.FindAll()
                ForEach ($Result2 In $Results2) 
                {   
                    $DN2 = $Result2.Properties.Item("distinguishedName")[0]
                    if($DN2 -eq $dnn){
                        $modi = $Result2.Properties.Item("modifyTimeStamp")[0]
                        if($modi){
                            $lastmd.Add($modi)|Out-Null                            
                        }
                    } 
                }
            }
            catch{
                $error = $true
            }                    
        }
        if($error -eq $true){
            $lastModi = "None-set"
            $global:noneModi++
        }
        else{
          $lastModi = ($lastmd |measure -max).maximum      
          if($lastModi -ne $null){   
                $lastModi = $lastModi.ToString("yyyy/MM/dd")
                if($lastModi.split("/")[0] -eq 2015){
                     $global:modi2015++
                }       
                elseif($lastModi.split("/")[0] -eq 2016){
                     $global:modi2016++
                }
                elseif($lastModi.split("/")[0] -eq 2017){
                     $global:modi2017++
                }
                 else{
                     $global:otherModi++
                }
            }
            else{
                $lastModi = "N/A"
                $global:noneModi++
            }
        }
        #$lastModi
      $obj = New-Object -TypeName psobject
      $obj | Add-Member -MemberType NoteProperty -Name "modi" -Value $lastModi      
      $obj | Export-Csv -Path "$outFileModi" -NoTypeInformation -append -Delimiter $Delimiter

   }
}
modiScan

您不使用cmdlet有什么具体原因吗?目录搜索程序比AD cmdlet快得多。此外,该脚本中还有几个foreach循环。这肯定会减慢速度。@Fairy,我无法使用cmdlet的某些特殊原因:/@Jason我认为当它必须将值存储到数组时,速度会变慢。是的,Foreach循环也是,pointArrayLists比arrays好,所以这一点对您有利。还有其他一些小问题,比如你应该使用
开关
,而不是所有那些ifs。你们有多少个DC?您的日期检查可能会有所改进。测量对象被认为是慢的。简单的排序应该更快。不过,我不希望在那里获得巨大的收益。此代码不完整,因为未根据我所看到的定义
$userObjects
。是否有特定原因,为什么不使用cmdlet?目录搜索程序比AD cmdlet快得多。此外,该脚本中还有几个foreach循环。这肯定会减慢速度。@Fairy,我无法使用cmdlet的某些特殊原因:/@Jason我认为当它必须将值存储到数组时,速度会变慢。是的,Foreach循环也是,pointArrayLists比arrays好,所以这一点对您有利。还有其他一些小问题,比如你应该使用
开关
,而不是所有那些ifs。你们有多少个DC?您的日期检查可能会有所改进。测量对象被认为是慢的。简单的排序应该更快。不过,我不希望在那里获得巨大的收益。此代码不完整,因为我所看到的未定义
$userObjects