У меня есть рабочее решение, однако я почти уверен, что существует менее ресурсоемкий метод, поскольку текущее решение включает в себя выполнение запроса для получить члена группы, а затем запрос, чтобы получить информацию о каждом пользователе.
Вот код, который у меня есть:
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...
}
К сожалению, это почему-то не работает.