C# and Sun One Directory Server : Retrieve Domain Group Members
If you have already worked on the Sun One Directory Server product, you might already know that SunONE Directory Server is a robust, scalable server designed to manage an enterprise-wide directory of users and resources. This is something like the Active Directory Microsoft has built for windows.
When working with the Sun One directory using C# & the .Net 2.0/Above, most of the developers find it difficult to get the Members of a group within a domain programmatically. This post should help few of those developers to resolve the problem. You can easily query the directory to get all the members of a group using c#.
Now, how do we get the members?
No more hitting the bush. Lets write code. Create a console/web/windows application using Visual Studio. In my case, have used a console application for making the things quick.
First, create a entity which can hold the details of a group user like Id, Full Name of the user, email id of user, path where he resides. Create a class CLDAPUser with the below code.
class CLDAPUser
{
private string m_sUId = string.Empty;
private string m_sFullName = string.Empty;
private string m_sEmailId = string.Empty;
private string m_sPath = string.Empty;
public string Uid
{
get
{ return m_sUId; }
set
{ m_sUId = value;}
}
public string FullName
{
get
{return m_sFullName;}
set
{m_sFullName = value;}
}
public string EmailId
{
get
{return m_sEmailId;}
set
{m_sEmailId = value;}
}
public string Path
{
get
{return m_sPath;}
set
{m_sPath = value;}
}
}
Now, let us write the function to retrieve the Sun One Users of a Group. I have added comments inside which gives the explanation
//Include the below namespaces.
using System.Collections.Generic;
using System.DirectoryServices;
private static List<CLDAPUser> SunOne_GetGroupMembers(string i_sGroup, string i_sADsPath, string i_sDomainName, string i_sPath)
{
string sFName = string.Empty;
string sLName = string.Empty;
string sFullName = string.Empty;
string sMail = string.Empty;
string sADsPath = string.Empty;
string sPath = string.Empty;
List<CLDAPUser> objLdapUserList = new List<CLDAPUser>();
try
{
DirectoryEntry oRoot = new DirectoryEntry();
oRoot.Path = i_sADsPath;
oRoot.AuthenticationType = AuthenticationTypes.ServerBind;
oRoot.Username = m_sUserName;
oRoot.Password = m_sPassword;
sADsPath = i_sADsPath.Substring(0, i_sADsPath.LastIndexOfAny("/".ToCharArray()));
DirectorySearcher oDSSearcher = new DirectorySearcher(oRoot);
//The very important step. CN = Group Name & uniqueMember=* is a filter which returns all members from Sun One
oDSSearcher.Filter = "(&(CN=" + i_sGroup + ")(uniqueMember=*))";
SearchResultCollection oSRC = oDSSearcher.FindAll();
foreach (SearchResult oSResult in oSRC)
{
ResultPropertyCollection resultPropColl = oSResult.Properties;
//Loop to iterate for each sun one user of the group and get the details further
foreach (object oMemberColl in resultPropColl["uniqueMember"])
{
DirectoryEntry ogpMemberEntry = new DirectoryEntry(sADsPath + "/" + oMemberColl.ToString());
ogpMemberEntry.AuthenticationType = AuthenticationTypes.ServerBind;
ogpMemberEntry.Username = m_sUserName;
ogpMemberEntry.Password = m_sPassword;
System.DirectoryServices.PropertyCollection oUserProps = ogpMemberEntry.Properties;
string sID = oUserProps["uid"].Value.ToString();
if (sID != "")
{
try
{
//givenname is the property name to get the First Name of Sun One User
sFName = oUserProps["givenname"].Value.ToString();
}
catch (Exception ex) { /*Do Some Error Logging*/ sFName = "N/A"; }
try
{
//sn is the property name to get the Last Name of Sun One User
sLName = oUserProps["sn"].Value.ToString();
}
catch (Exception ex) { /*Do Some Error Logging*/ sLName = "N/A"; }
sFullName = sFName + " " + sLName;
try
{
//mail is the property name to get the email address of Sun One User
sMail = oUserProps["mail"].Value.ToString();
}
catch (Exception ex) { /*Do Some Error Logging*/ sMail = "N/A"; }
try
{
sPath = oMemberColl.ToString();
}
catch (Exception ex) { /*Do Some Error Logging*/ sPath = "N/A"; }
//Store the details
CLDAPUser objLdapUser = new CLDAPUser();
objLdapUser.Uid = sID;
objLdapUser.FullName = sFullName;
objLdapUser.EmailId = sMail;
objLdapUser.Path = sPath;
//Add this user detail to the list
objLdapUserList.Add(objLdapUser);
}
}
}
}
catch (Exception ex) { /*Do Some Error Logging*/}
//The List contains all the users/members of the group!
return objLdapUserList;
}
Now, we need to call the above function with required parameters. Here we go. Write it in Main() of your console application
//This is the Group for which we need to Retrieve the Users from Sun One string sGroup = "Accounting Managers"; //Port the Sun One Server is Listening at int iPort = 30291; //Server string sServername = "192.168.37.202"; //Domain String string sDomainstr = "dc=yoursun1,dc=local"; //Create LDAP Path based on above credentials string sAdsPath = "LDAP://" + sServername + ":" + iPort + "/" + sDomainstr; //I dont have a user name password required to connect to Sun One so let me make it null. m_sUserName = null; m_sPassword = null; //Create a list to Hold Sun One Users List<CLDAPUser> objLdapUserList = new List<CLDAPUser>(); //Finally, Get the Sun One users for the Group by calling the function objLdapUserList = SunOne_GetGroupMembers(sGroup, sAdsPath, sDomainstr, sDomainstr);And thats it!!, pass any Group name and you get the users within it. Easy. Isnt it?
Lets do programming together. You can follow me on twitter @MSGuyTweets or find me on Facebook at Facebook.com/MysoreGuy