protected virtual IReadOnlyCollection<IPrincipal> ResolveMembers(Principal parent, bool isRecursive, ICollection<string> additionalPropertyNames)
{
if (!parent.IsGroup)
{
return new IPrincipal[0];
}
var results = new List<IPrincipal>();
foreach (string childDomainPath in parent.ChildDomainPaths)
{
string fullChildDomainPath = domainPath.GetPathWithProtocol() + "/" + childDomainPath;
if (!results.Any(user => user.DomainPath.Equals(fullChildDomainPath)))
{
using (var childDirectoryEntry = new DirectoryEntry(fullChildDomainPath))
{
Principal childPrincipal = Principal.FromDirectoryEntry(childDirectoryEntry, additionalPropertyNames);
results.Add(childPrincipal);
if (isRecursive)
{
IEnumerable<IPrincipal> childPrincipalMembers = ResolveMembers(childPrincipal, true, additionalPropertyNames);
results.AddRange(childPrincipalMembers.Where(p => results.All(r => r.NativeGuid != p.NativeGuid)));
}
}
}
}
return results;
}