2016-09-26 3 views
0

Я могу легко получить список OU из AD нашего домена, но я хочу только захватить OU с учетными записями пользователей.Показывать Active Directory OU, содержащие учетные записи пользователей

В настоящее время я захватываю список OU, а затем просматриваю каждый, чтобы получить список пользователей и счет, но для обработки всех этих данных может потребоваться около 30 секунд.

Я надеялся, что есть еще более быстрый способ выполнить ту же задачу.

Public Sub GetActiveDirectoryOuList() 
    Dim de As DirectoryEntry = Nothing 
    Dim ds As DirectorySearcher = Nothing 
    Dim results As SearchResultCollection = Nothing 

    Try 
     de = New DirectoryEntry("LDAP://DC=csileasing,DC=com") 
     ds = New DirectorySearcher(de, "(objectClass=organizationalUnit)") 
     results = ds.FindAll 

     If results.Count = 0 Then Exit Try 

     For Each result As SearchResult In results 
      Dim count As Integer = GetUserCountForOU(result.Properties("distinguishedName")(0).ToString) 
      If count > 0 Then 
       Dim ou As New OrgUnitInfo 
       ou.DistinguisedName = result.Properties("distinguishedName")(0).ToString 
       ou.Name = result.Properties("name")(0).ToString 
       ou.UsersCount = count 
       adOrgUnitList.Add(ou) 
      End If 
     Next 

    Catch ex As Exception 
     'MessageBox.Show(ex.Message) 
    Finally 
     If ds IsNot Nothing Then ds.Dispose() 
     If de IsNot Nothing Then de.Dispose() 
     If results IsNot Nothing Then results.Dispose() 
    End Try 

End Sub 
+0

Вы можете кэшировать результат где-то и аннулировать кеш в определенном расписании или на основе определенного запроса на аннулирование кеша. Затем, когда вам нужно получить информацию, прочитайте ее из кеша. –

+0

Есть ли способ получить счетчик пользователей для OU без чтения в полном списке пользователей, а затем сделать счет? Чтение всех пользователей от каждого из подразделений в AD - это та часть, которая ведется навсегда. – JoshF

ответ

0

Я бы удостоверился, что мои операции DirectorySearcher запрашивают наименьшее количество данных. В поиске OU указать только параметры, которые вы хотите использовать, так как такие

ds = New DirectorySearcher(de, "(objectClass=organizationalUnit)", {"distinguishedName", "name"}) 

Также возможно попытаться сделать то же самое для вашего метода GetUserCountForOU, если он ищет для всех пользователей со всеми их свойствами, то его вполне нормально для того, чтобы это было так долго. Вы можете указать пустой массив PropertiesToLoad с Filter="(&(objectClass=user)(!objectClass=computer))", а DirectorySearcher будет искать только objectGuid (Если я это правильно помню). Вам просто нужно посчитать итоговые записи, чтобы получить ваш ou.UsersCount.

+0

Спасибо за предложение Masma. Я попробую, когда вернусь к этому проекту. – JoshF

Смежные вопросы