Быстрый способ поиска по большому списку имен компьютеров и нескольких доменов с помощью Get-ADComputer в Powershell - PullRequest
0 голосов
/ 28 февраля 2019

Мне интересно, что было бы оптимальным способом поиска по большому списку (50k +) имен хостов по 5 доменам с использованием Get-ADComputer.

Идея, которую я имею, состоит в том, что у вас есть массив $ доменов.и список имен хостов. Foreach ($domain in $domains) { $results = $hostnames | ForEach-Object { Get-ADComputer -Server $domain -Filter "Name -eq '$($_)'" -Properties * } | Out-DataTable

Нет SearchBase, потому что мы не уверены, где в структуре AD может находиться машина, и, очевидно, мы не знаем, какой это домен.Свойства *, так как я ищу все обратно.Даже если бы он был ограничен, мы бы искали минимум 8-10 объектов недвижимости.Я играл с идеей удаления элементов из списка $ hostnames, когда что-то найдено.

1 Ответ

0 голосов
/ 28 февраля 2019

Сетевые запросы причинят вам боль больше всего.Ключом к скорости является снижение количества сетевых запросов.

Я написал статью о повышении производительности при работе с 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 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...