namespace Alpha.Code
{
public class SecurityContextEx
{
public static string getDomainName()
{
return IPGlobalProperties.GetIPGlobalProperties().DomainName;
}
public static string getLDAPDomainName(string domainName)
{
StringBuilder sb = new StringBuilder();
string[] dcItems = domainName.Split(".".ToCharArray());
sb.Append("LDAP://");
foreach (string item in dcItems)
{
sb.AppendFormat("DC={0},", item);
}
return sb.ToString().Substring(0, sb.ToString().Length - 1);
}
public static List<ADUser> GetUsersInGroup(string group)
{
List<ADUser> users = new List<ADUser>();
string ldapDomainName = SecurityContext.getLDAPDomainName(SecurityContext.getDomainName());
string domainName = ldapDomainName.Replace("LDAP://", string.Empty);
List<string> groupMemebers = new List<string>();
DirectoryEntry de = new DirectoryEntry(ldapDomainName);
DirectorySearcher ds = new DirectorySearcher(de, "(objectClass=person)");
ds.Filter = "(&(objectClass=group)(cn=" + group + "))";
foreach (SearchResult result in ds.FindAll())
{
var dir = result.GetDirectoryEntry();
var list = dir.Invoke("Members");
IEnumerable entries = (IEnumerable)list;
foreach (var entry in entries)
{
DirectoryEntry member = new DirectoryEntry(entry);
if (member.SchemaClassName == "group")
{
List<ADUser> usersInGroup =
GetUsersInGroup(member.Properties["name"][0].ToString());
foreach (ADUser aduser in usersInGroup)
{
if (!users.ToDictionary(u => u.Name).ContainsKey(aduser.Name))
{
users.Add(aduser);
}
}
}
else
{
ADUser aduser = new ADUser(
(byte[])member.Properties["objectSid"][0],
member.Properties["name"][0].ToString(),
member.Properties["distinguishedName"][0].ToString(),
member.Properties["sAMAccountName"][0].ToString());
users.Add(aduser);
}
}
}
return users;
}
}
}