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


Popular posts from this blog

Image upload using JQuery + Uploadify + ASP.Net Custom Handler

Generating reports with Templater, MS Word & C#

Creating a cool Microsoft Word Report for listing Scientists with Templater and C# Generic List