Получить всех пользователей в Active Directory - PullRequest
2 голосов
/ 16 марта 2011

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

Public Function GetAllUsers(ByVal ldapServerName As String) As Hashtable
    'To retrieve list of all  LDAP users

    'This function returns HashTable
    _ldapServerName = ldapServerName

    Dim sServerName As String = "mail"

    Dim oRoot As DirectoryEntry = New DirectoryEntry("LDAP://" & ldapServerName & _
          "/ou=People,dc=mydomainname,dc=com")

    Dim oSearcher As DirectorySearcher = New DirectorySearcher(oRoot)
    Dim oResults As SearchResultCollection
    Dim oResult As SearchResult
    Dim RetArray As New Hashtable()

    Try

        oSearcher.PropertiesToLoad.Add("uid")
        oSearcher.PropertiesToLoad.Add("givenname")
        oSearcher.PropertiesToLoad.Add("cn")
        oResults = oSearcher.FindAll

        For Each oResult In oResults

            If Not oResult.GetDirectoryEntry().Properties("cn").Value = "" Then
                RetArray.Add(oResult.GetDirectoryEntry().Properties("uid").Value, _
                  oResult.GetDirectoryEntry().Properties("cn").Value)
            End If

        Next

    Catch e As Exception

        'MsgBox("Error is " & e.Message)
        Return RetArray

    End Try

    Return RetArray

End Function

Чтобы убедиться, что я делаю это правильно, ldapServerName должно быть доменным именем, в которое я вхожу, и которое я вижу, когдаI CTRL + alt + del , верно?Или это относится к dc=mydomainname части?

Первая ошибка в этом коде выше на _ldapServerName = ldapServerName

Ошибка говорит:

 Error 14 '_ldapServerName' is not declared. It may be inaccessible due to its protection level.

marc_s update

    ' create a domain context for your default domain
    Dim ctx As New PrincipalContext(ContextType.Domain)

    ' define a "query-by-example" to search for
    Dim searchExample As Principal = New UserPrincipal(ctx)

    ' define the principal searcher, based on that example principal
    Dim ps As New PrincipalSearcher(searchExample)

    ' loop over all principals found by the searcher
    For Each p As Principal In ps.FindAll()
        ' do whatever you want to do with the principals
        Console.WriteLine("Type: {0} / Name: {1}", p.StructuralObjectClass, p.Name)
    Next

update 2

Когда я использую IE и ввод ldap://mydomainhere.com/ou=Users

Я не получаючто угодно ... Но когда я просто делаю это:

 ldap://mydomainhere.com

Затем появляется окно "найти людей".Итак, я знаю, что у меня правильный LDAP, но не уверен, почему другая информация мешает ему работать ...

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Если ваша AD не слишком большая, и вы используете .NET 3.5 или более позднюю версию (что, как я полагаю, поскольку вы используете VS2010), вы должны написать что-то вроде:

// create a domain context for your default domain
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" to search for
Principal searchExample = new UserPrincipal(ctx);

// define the principal searcher, based on that example principal
PrincipalSearcher ps = new PrincipalSearcher(searchExample);

// loop over all principals found by the searcher
foreach(Principal p in ps.FindAll())
{
    // do whatever you want to do with the principals
    Console.WriteLine("Type: {0} / Name: {1}", p.StructuralObjectClass, p.Name);
}

PS: Чтобы "найти свой LDAP", вы можете взглянуть на мой C #, LDAP-браузер с открытым исходным кодом под названием BeaverTail - доступный бесплатно (C #,. NET 1.1 таймфрейм)

enter image description here

Обновление: если вы хотите выбрать всех пользователей в определенном месте (и его субконтейнерах), вы можете сделать это, указав эту «начальную точку» в контексте вашего домена:

// create a domain context for your default domain, 
// starting at a specific location
PrincipalContext ctx = 
   new PrincipalContext(ContextType.Domain, "YOURDOMAIN", 
                        "OU=Personnel,OU=Users,DC=YourDomain,DC=com");

// define a "query-by-example" to search for
Principal searchExample = new UserPrincipal(ctx);

// define the principal searcher, based on that example principal
PrincipalSearcher ps = new PrincipalSearcher(searchExample);

// loop over all principals found by the searcher
foreach(Principal p in ps.FindAll())
{
    UserPrincipal up = (p as UserPrincipal);

    if(up != null)
    {
       // do whatever you want to do with the principals
       Console.WriteLine("Name: {0} / E-Mail: {1}", up.Name, up.EmailAddress);
    }
}
1 голос
/ 03 июля 2012
CStr(userlist(i).Properties("samAccountName").ToString)

Изменить на:

userlist(i).GetDirectoryEntry().Properties("givenName").Value

Это изменение сработало для меня

0 голосов
/ 17 марта 2011

В моем конкретном случае мне пришлось использовать:

Dim oRoot As DirectoryEntry = New DirectoryEntry("LDAP://CN=Users,DC=YOUR_DOMAIN_NAME_HERE,DC=local")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...