Сбой поиска в Active Directory членов определенной группы, когда у пользователя нет группы - PullRequest
0 голосов
/ 19 сентября 2019

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

Однако во время работы и пошагового выполнения я заметил, что он остановлен наопределенный пользователь без группы.Я попытался добавить условный оператор, чтобы пропустить этот экземпляр, но он не работает, код по-прежнему останавливается, когда находит пользователя без группы.

Может кто-нибудь показать мне, что я могу делать по-другому?Предостережение: Это от унаследованного сайта, который я унаследовал, очень мало зная об активном каталоге и будучи начинающим vb-кодером.

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))",
        .PageSize = 4000
    }
    search.PropertiesToLoad.Add("userPrincipalName").ToString
    search.PropertiesToLoad.Add("name").ToString
    Dim mySearchResultColl As SearchResultCollection = search.FindAll
    Dim results As DataTable = New DataTable
    results.Columns.Add("User ID")        
    results.Columns.Add("Full Name")
    Dim CurrRow = 0

    For Each sr As SearchResult In mySearchResultColl

        Dim dr As DataRow = results.NewRow
        Dim de As DirectoryEntry = sr.GetDirectoryEntry
        !!!! line below is the problem !!!!
        If de.Properties("memberOf") IsNot Nothing AndAlso de.Properties("memberOf").Value.ToString = "CN=MYGROUP,OU=Security Groups,OU=Students,DC=DOMAIN,DC=edu" Then 
            dr("User ID") = de.Properties("userPrincipalName").Value           
            dr("Full Name") = de.Properties("name").Value
            results.Rows.Add(dr)
            de.Close
        End If
    Next

    gvNot.DataSource = results
    gvNot.DataBind()
    gvNot.Visible = True
    gvAgreed.Visible = False
    ExportToExcel("notagreed", gvNot)

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

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

  1. Этот цикл будет длиться вечно, так как выдолжны проверять каждого пользователя в домене.Если вы хотите, чтобы пользователи были только в определенной группе, вы можете ускорить это, только попросив членов группы.Это можно сделать, добавив условие в запрос для атрибута 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, но я оставил его на случай, если вы 'вы используете его в другом коде, который вы здесь не показывали.

0 голосов
/ 19 сентября 2019

Попробуйте использовать функцию String.Equals с параметром StringComparer.OrdinalIgnoreCase вместо оператора равенства.И что за ошибка вы получаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...