Как я могу получить список пользователей из активного каталога?

Как я могу получить список пользователей из активного каталога? Есть ли способ вытащить имя пользователя, имя, фамилию? Я видел подобный пост, где это было использовано:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

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

Ответ 1

Если вы новичок в Active Directory, я предлагаю вам понять, как Active Directory сохраняет данные в первую очередь.

Active Directory на самом деле является сервером LDAP. Объекты, хранящиеся на сервере LDAP, хранятся иерархически. Он очень похож на то, что вы храните файлы в своей файловой системе. Вот почему он получил имя Directory Server и Active Directory

Контейнеры и объекты в Active Directory могут быть указаны с помощью distinguished name. Различающееся имя похоже на CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com. Как традиционная реляционная база данных, вы можете запускать запрос с сервера LDAP. Он вызвал запрос LDAP.

Существует несколько способов запуска LDAP-запроса в .NET. Вы можете использовать DirectorySearcher из System.DirectoryServices или SearchRequest from System.DirectoryServices.Protocol.

Для вашего вопроса, поскольку вы запрашиваете конкретный пользовательский объект, я считаю, что наиболее интуитивным способом является использование PrincipalSearcher из System.DirectoryServices.AccountManagement. Вы можете легко найти множество разных примеров из Google. Вот пример, который делает именно то, о чем вы просите.

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

Обратите внимание, что на объекте пользователя AD имеется несколько атрибутов. В частности, givenName даст вам First Name и sn даст вам Last Name. О имени пользователя. Я думаю, вы имели в виду имя пользователя для входа в систему. Обратите внимание, что есть два имени входа в пользовательский объект AD. Один из них - samAccountName, который также известен как имя пользователя для входа в систему до Windows 2000. userPrincipalName обычно используется после Windows 2000.

Ответ 2

Если вы хотите отфильтровать активные аккаунты, добавьте это в код Харви:

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

после первого использования. Затем добавьте

  searcher.QueryFilter = userPrin;

прежде чем найти все. И это должно сделать вас активными.

Ответ 3

Включите System.DirectoryServices.dll, затем используйте следующий код:

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="<strong class="highlight">Users</strong> :  ";
foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);