Multithreading 在DC&x27中加速;s扫描
我正在构建一个脚本,它将进入每个DC,从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"
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