Я получил рабочее решение, однако я почти уверен, что есть менее ресурсоемкий метод, потому что текущее решение включает в себя выполнение запроса для получения члена группы, а затем запроса для получения информации о каждом пользователе.
Вот код, который у меня есть:
DirectoryEntry root = new DirectoryEntry( "LDAP://server:port" );
DirectorySearcher searcher = new DirectorySearcher( root );
searcher.Filter = "(&(ObjectClass=Group)(CN=foo-group))";
var members = (IEnumerable)searcher.FindOne()
.GetDirectoryEntry()
.Invoke( "members" );
Dictionary<string , string> results = new Dictionary<string , string>();
foreach( object member in members ) {
DirectoryEntry de = new DirectoryEntry( member );
results.Add( de.Properties[ "SAMAccountname" ][ 0 ].ToString(), de.Properties[ "cn" ][ 0 ].ToString() );
}
В идеале я хотел бы иметь возможность выполнить один запрос, чтобы каждый пользователь, являющийся членом группы, фильтровал загружаемые свойства и затем отображал их. Так как то так
DirectoryEntry root = new DirectoryEntry( "LDAP://server:port" );
DirectorySearcher searcher = new DirectorySearcher( root );
searcher.PropertiesToLoad.Add( "cn" );
searcher.PropertiesToLoad.Add( "SAMAccountname" );
searcher.Filter = "(&(ObjectClass=user)(memberof=foo-group))";
foreach( var user in searcher.FindAll() ) {
//do whatever...
}
К сожалению, это не работает по какой-то причине.