Как я могу получить список пользователей из активного каталога? - PullRequest
95 голосов
/ 02 марта 2011

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

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

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

Ответы [ 4 ]

209 голосов
/ 02 марта 2011

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

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

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

Существует несколько способов выполнить запрос LDAP в .NET. Вы можете использовать DirectorySearcher из System.DirectoryServices или SearchRequest из 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.

21 голосов
/ 30 сентября 2014

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

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

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

  searcher.QueryFilter = userPrin;

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

4 голосов
/ 21 февраля 2018

Конечно, заслуга @Harvey Kwok здесь, но я просто хотел добавить этот пример, потому что в моем случае я хотел получить фактический список UserPrincipals. Вероятно, более эффективно фильтровать этот запрос заранее, но в моей маленькой среде проще всего извлечь все, а затем отфильтровать по мере необходимости из моего списка.

В зависимости от того, что вам нужно, вам может не потребоваться приведение к DirectoryEntry, но некоторые свойства недоступны из UserPrincipal.

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}
1 голос
/ 02 марта 2011

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

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

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