Сетевые запросы причинят вам боль больше всего.Ключом к скорости является снижение количества сетевых запросов.
Я написал статью о повышении производительности при работе с AD.Одна вещь, о которой я говорил, это просила столько, сколько вы можете за один раз .Идея состоит в том, чтобы использовать несколько условий "или", чтобы вернуть несколько объектов в одном запросе.Пример, который я написал, есть в C #, но вы можете адаптировать его для PowerShell, который я попытался описать ниже.Будет выполнен поиск группы из 50 имен компьютеров.Вы можете сойти с рук 100 или больше.Предел для одного запроса LDAP (не только строки запроса, но и всего пакета запроса) составляет 10 МБ.
Удаление имен по мере их нахождения также является хорошей идеей, которую я позволил себе добавить.Вы должны преобразовать массив в List
, чтобы иметь возможность использовать .Remove()
.
$hostnames = [Collections.Generic.List[String]]$hostnames
Foreach ($domain in $domains) {
$filter = ""
$count = 0
For ($i=0; $i -lt $hostnames.Count; $i++) {
if ($filter -eq "") {
$filter += "Name -eq $($hostnames[$i])"
} else {
$filter += " -or Name -eq $($hostnames[$i])"
}
$count++
#check if we have 50 names in the filter, or we're on our last one
if ($count -eq 50 -or $i -eq $hostnames.Count - 1) {
$found = Get-ADComputer -Server $domain -Filter $filter -Properties *
$found | Out-DataTable
$found | ForEach {
$hostnames.Remove($_.Name) > $null
}
$filter = ""
}
}
}
Если все 5 доменов находятся в одном лесу AD, то вы можете избавиться от цикла домена ипоиск в глобальном каталоге.Тогда вам не нужно беспокоиться об удалении найденных имен из списка.Это можно сделать, передав порт GC параметру -Server
:
$found = Get-ADComputer -Server "$($domain):3268" -Filter $filter -Properties *