 <p>If you only need to find direct members, you can use Attribute Scope Query (ASQ). This requires domain/forest functional level of 2003 (forgot domain or forest).</p> <pre><code>DirectoryEntry groupEntry = new DirectoryEntry("LDAP://&lt;server&gt;/&lt;group DN&gt;", "user", "pwd"); DirectorySearcher searcher = new DirectorySearcher(groupEntry); searcher.SearchScope = SearchScope.Base; searcher.AttributeScopeQuery = "member"; searcher.Filter = "(&amp;(objectCategory=person)(objectClass=user))"; searcher.PropertiesToLoad.Clear(); searcher.PropertiesToLoad.Add("name"); searcher.PropertiesToLoad.Add("mail"); searcher.PropertiesToLoad.Add("displayName"); foreach (SearchResult result in searcher.FindAll()) { Console.WriteLine(result.Path); } </code></pre> <p>For nested group members, you may use the LDAP_MATCHING_RULE_IN_CHAIN matching rule. This requires domain/forest functional level of 2008 R2 (again, forgot domain or forest).</p> <pre><code>DirectoryEntry rootEntry = new DirectoryEntry("GC://&lt;server&gt;", "user", "pwd"); DirectorySearcher searcher = new DirectorySearcher(rootEntry); searcher.SearchScope = SearchScope.Subtree; searcher.Filter = "(&amp;(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=&lt;group DN&gt;))"; searcher.PropertiesToLoad.Clear(); searcher.PropertiesToLoad.Add("name"); searcher.PropertiesToLoad.Add("mail"); searcher.PropertiesToLoad.Add("displayName"); foreach (SearchResult result in searcher.FindAll()) { Console.WriteLine(result.Path); } </code></pre> <p><strong>Limitations:</strong></p> <ul> <li>Both methods don't handle primary group membership</li> <li>ASQ don't work across domain, an exception will be thrown if member from another domain is found. So normally you can only perform this for global groups.</li> </ul>