Медленный запрос Get-ADUser - PullRequest
2 голосов
/ 26 февраля 2020

Что-то я не понимаю. См. Следующие два примера кода.

  $LDAPResult1 = Get-ADUser -LDAPFilter "(&(objectCategory=user)(sAMAccountName=*))" -Properties @("distinguishedName","sAMAccountName","extensionAttribute13") -SearchBase "ou=test,dc=test,dc=ch"
  $LDAPElements1=@{}
  $LDAPResult1 |% {$LDAPElements1.Add($_.SAMAccountName, $_.extensionattribute13)}

по сравнению с (добавление указанного c сервера для запроса "-Server 'd c .test.test.ch'"):

  $LDAPResult1 = Get-ADUser -LDAPFilter "(&(objectCategory=user)(sAMAccountName=*))" -Properties @("distinguishedName","sAMAccountName","extensionAttribute13") -SearchBase "ou=test,dc=test,dc=ch" -Server 'dc.test.test.ch'
  $LDAPElements1=@{}
  $LDAPResult1 |% {$LDAPElements1.Add($_.SAMAccountName, $_.extensionattribute13)}

Первый код занимает 30 секунд, второй около 5 минут. Проблема не в запросе AD. Это занимает около 30 секунд в обоих случаях. Но заполнение результата в таблице ha sh - это то, что отличается rnet. Кажется, что во втором случае при заполнении подоконника ha sh запрашиваются некоторые данные из D C.

Что также интересно. Когда я подожду пять минут после выполнения запроса AD в случае два, а затем выполню заполнение в таблице ha sh, команда займет секунду.

Я бы предпочел определить, к какому серверу подключается команда, чтобы выполнить следующие команды на том же D C, но это не имеет смысла, если это занимает много времени.

Может ли кто-нибудь просветить меня ...

Дополнение: Мы говорим о 26'000 аккаунтах.

1 Ответ

1 голос
/ 26 февраля 2020

Мне удалось повторить это. Поведение меняется, когда вы указываете параметр -Server, а когда нет.

Я использовал Process Monitor для наблюдения за сетевой активностью, и он определенно говорит с D * 1032. * при циклическом просмотре результатов, возвращаемых с использованием параметра -Server.

Я не могу объяснить, почему, но похоже, что возвращенные объекты ADUser не заполняются свойствами из поиска. Поэтому, когда к ним обращаются, он загружает свойства из D C. Я мог видеть это при доступе к одному конкретному элементу в массиве:

$LDAPResults1[1000]

Он отображал свойства, но я также видел сетевую активность в Process Monitor. Принимая во внимание, что я не вижу сетевой активности при доступе к одному элементу из результатов, возвращаемых, когда не используется параметр -Server.

Так что это объясняет , что происходит , но не почему . И я действительно не знаю, почему.

Тем не менее, я понял, что если вы хотите повысить производительность во время разговора с AD, вы должны отказаться от всех «простых» способов и делать все самостоятельно. Например, используйте классы. NET DirectoryEntry и DirectorySearcher напрямую, что можно сделать в PowerShell с помощью «ускорителей типов» [adsi] и [adsisearcher] , Например, это будет делать то же самое и будет работать последовательно:

$dc = "dc.test.test.ch"
$searchBase = "ou=test,dc=test,dc=ch"
$searcher = [adsisearcher]::new([adsi]"LDAP://$dc/$searchBase", "(objectCategory=user)")

$searcher.PropertiesToLoad.Add("sAMAccountName") > $null
$searcher.PropertiesToLoad.Add("extensionAttribute13") > $null

$searcher.PageSize = 1000

$LDAPElements1=@{}
foreach ($result in $searcher.FindAll()) {
    $LDAPElements1.Add($result.Properties["sAMAccountName"][0], $result.Properties["extensionAttribute13"][0])
}
...