Я не уверен, что вы подразумеваете под словом "останавливается", но вы можете изменить это значение, чтобы оно работало лучше и исправляло все возникающие проблемы.
- Этот цикл будет длиться вечно, так как выдолжны проверять каждого пользователя в домене.Если вы хотите, чтобы пользователи были только в определенной группе, вы можете ускорить это, только попросив членов группы.Это можно сделать, добавив условие в запрос для атрибута
memberOf
.Таким образом, вы получите только те результаты, которые вам небезразличны.
(Обратите внимание, что если в вашем лесу более одного домена, использование memberOf
для поиска участников может работать не так, как вы хотите. Iписал об этом здесь . Но если у вас есть только один домен, то все будет хорошо.)
В цикле не создавайте DirectoryEntry
для каждого результата, поскольку это заставит его вернуться в AD и снова запросить атрибуты для объекта, даже если вы уже получили то, что вам нужнов результатах поиска.Поэтому используйте вместо этого значения в объекте SearchResult
.
Документация для SearchResultCollection
гласит:
Из-за ограничений реализации класс SearchResultCollection не может освободить все свои неуправляемые ресурсы при сборке мусора.Чтобы предотвратить утечку памяти, вы должны вызывать метод Dispose, когда объект SearchResultCollection больше не нужен.
Таким образом, вы должны поместить это в предложение Using
.
Я также не уверен, почему вы звоните
ToString
на
PropertiesToLoad.Add
, когда вы не используете возвращаемое значение.Вы можете просто удалить это.
Здесь все это вместе:
Dim entry As DirectoryEntry = New DirectoryEntry("LDAP://DOMAIN.EDU", "USERNAME", "PASSWORD", AuthenticationTypes.Secure)
Dim search As DirectorySearcher = New DirectorySearcher(entry) With {
.Filter = "(&(objectCategory=User)(objectClass=person)(memberOf=CN=MYGROUP,OU=Security Groups,OU=Students,DC=DOMAIN,DC=edu))",
.PageSize = 4000
}
search.PropertiesToLoad.Add("userPrincipalName")
search.PropertiesToLoad.Add("name")
Dim results As DataTable = New DataTable
results.Columns.Add("User ID")
results.Columns.Add("Full Name")
Dim CurrRow = 0
Using mySearchResultColl As SearchResultCollection = search.FindAll
For Each sr As SearchResult In mySearchResultColl
Dim dr As DataRow = results.NewRow
dr("User ID") = sr.Properties("userPrincipalName")(0)
dr("Full Name") = sr.Properties("name")(0)
results.Rows.Add(dr)
Next
End Using
gvNot.DataSource = results
gvNot.DataBind()
gvNot.Visible = True
gvAgreed.Visible = False
ExportToExcel("notagreed", gvNot)
Я не вижу, чтобы вы где-нибудь использовали CurrRow
, но я оставил его на случай, если вы 'вы используете его в другом коде, который вы здесь не показывали.