Получить пользователей из Acctive Directory Group
Я создал доменное имя Active Directory 'ADDOMAIN2' с именем группы CommonUsers, имеющим 8 пользователей. но когда я делаю поиск в каталоге для пользователей в группе "CommonUsers", он возвращает нулевой результат. ее мой код
DirectorySearcher searcher = new DirectorySearcher();
DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("LDAP://{0}", "ADDOMAIN2"), "Administrator", "p@S$w0rd");
string dnPath = directoryEntry.Properties["distinguishedName"].Value.ToString();
// string path = string.Format("LDAP://{0}/{1}{2}", "ADDOMAIN2", "", dnPath);
string path = "LDAP://ADDOMAIN2/CN=CommonUsers,DC=ADDomain2,DC=ADDomain01,DC=WaveDomain";
directoryEntry.Path = path;
searcher.SearchRoot = directoryEntry;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection rs = searcher.FindAll();
Любая идея, что здесь не так?
Thanx
2 ответа
Попробуйте использовать какой-нибудь внешний браузер LDAP (например, старую и бесплатную версию 2.6 браузера Softerra LDAP), чтобы проверить, действительно ли строка запроса указывает на правильное местоположение.
DirectorySearcher не используется для поиска пользователей внутри группы. Он используется для поиска объектов по базовому пути. Поскольку под вашим объектом группы AD нет пользовательских объектов, вы ничего не найдете.
В большинстве случаев пользовательские объекты в группе AD можно найти по ее атрибуту member. Помните, что группа AD может содержать группу или пользователя. Таким образом, некоторые из входов могут быть групповыми. В некоторых случаях атрибут member не содержит ни группы AD, ни пользователя AD, он содержит принципала внешней безопасности. Это происходит, если ваш пользователь приходит из другого леса. Основная группа также обрабатывается по-разному. Даже "Пользователь домена" является основной группой большинства пользователей в AD, его атрибут member вообще ничего не содержит. Есть много других странностей, которые делают перечисление объекта группы AD действительно сложным.
К счастью, в.NET 3.5 Microsoft предоставляет некоторые полезные классы в рамках, чтобы сделать грязную работу за вас. Проверьте System.DirectoryServices.AccountManagement
Чтобы получить несколько быстрых примеров, вы можете проверить эту статью codeproject
Ваш код должен быть примерно таким.
PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com");
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "Domain Users");
foreach (Principal principal in groupPrincipal.GetMembers(false))
{
Console.Out.WriteLine(principal.DistinguishedName);
}
Console.In.ReadLine();