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



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



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


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

565   4  

4 ответов:

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

Active Directory на самом деле является сервером LDAP. Объекты, хранящиеся на сервере LDAP, хранятся иерархически. Это очень похоже на то, как вы храните свои файлы в своей файловой системе. Вот почему он получил название каталог Server и 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. Вы можете легко найти много различных примеров из гугла. Вот пример, который делает именно то, что вы просите.

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

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

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

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

  searcher.QueryFilter = userPrin;

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

конечно, кредит идет на @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());
        }
}

включить систему.Каталог.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);

Comments

    Ничего не найдено.