加快DC的扫描速度

时间:2017-07-21 13:46:33

标签: multithreading performance powershell attributes

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

$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

0 个答案:

没有答案